【问题标题】:Printing integers in the ascending order recursively以递归方式以升序打印整数
【发布时间】:2020-02-19 17:44:38
【问题描述】:

今天我参加了考试,有一道题:

编写一个以升序顺序递归从1到n打印整数的方法:

public class PrintIntegersAscendingOrder {

    static int counter = 0;
    public static void PrintIntegersAscendingOrder (int n)
    {
        if (n == 1)
        {

            System.out.printf("%d\n", ++counter);
        }
        else
        {
            System.out.printf("%d ", ++counter);
            PrintIntegersAscendingOrder(n-1);
        }

    }
    public static void main (String args[])
    {
        PrintIntegersAscendingOrder(5);
    }
}

虽然这个方法现在有效,但最初的问题并没有要求类定义,而是方法。在那里,我无法安装计数器(我在纸上的 if 内写了 counter,但它在程序中给出了错误)。如何在没有计数器变量的情况下准确正确地编写方法?

【问题讨论】:

  • 计数器在这里违背了递归的目的
  • Ulvi Bajarani - 如果其中一个答案解决了您的问题,您可以通过将其标记为已接受来帮助社区。接受的答案有助于未来的访问者自信地使用该解决方案。查看meta.stackexchange.com/questions/5234/… 了解如何操作。

标签: java recursion methods printing


【解决方案1】:

你可以这样做:

public class IntegerAscendingOrder {
    public static void main(String[] args) throws Exception {
        printIntegersAscendingOrder(n);
    }

    private static void printIntegersAscendingOrder(int i) {
        if (i < 1) {
            return;
        }

        printIntegersAscendingOrder(i-1);
        System.out.println(i);
    }
}

您不需要类中的计数器变量,使用递归您可以将方法调用限制在方法本身内。

注意if (i &lt; 1) {return;} 行,这将终止递归方法调用。

这篇文章应该对你有帮助Getting started with recursion

【讨论】:

    【解决方案2】:

    按如下方式进行:

    public class Main {
        public static void printIntegersAscendingOrder(int n) {
            if (n == 0) {
                return;
            }
            printIntegersAscendingOrder(n - 1);
            System.out.printf("%d ", n);
        }
    
        public static void main(String args[]) {
            printIntegersAscendingOrder(5);
        }
    }
    

    输出:

    1 2 3 4 5 
    

    正如@RobOhRob 已经指出的那样,计数器违背了代码中递归的目的。当你在递归调用一个函数时,你需要分析三个重要的事情:

    1. 何时停止递归调用
    2. 进行递归调用之前的处理
    3. 进行递归调用之前的处理

    由于您已经将参数减少1 并将其传递给方法以递归调用它,因此您可以简单地使用此参数而不是创建额外的变量(例如counter)。

    【讨论】:

    • 请说明代码中的错误以及此解决方案如何提供帮助。
    【解决方案3】:

    在您的代码中,您在类中定义了一个方法PrintIntegersAscendingOrder,该方法与包含它的类PrintIntegersAscendingOrder 具有相同的名称。这是一个可以避免的错误,例如将包含类重命名为PrintIntegers。在没有错误和递归方法的类代码下面:

    public class PrintIntegers {
        public static void PrintIntegersAscendingOrder(int n) {
            if (n > 0) {
                PrintIntegersAscendingOrder(n - 1);
                System.out.printf("%d\n", n);   
            }
        }
        public static void main (String args[]) {
            PrintIntegersAscendingOrder(5);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-18
      • 2021-06-05
      • 2017-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-14
      相关资源
      最近更新 更多