【问题标题】: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,但它在程序中给出了错误)。如何在没有计数器变量的情况下准确正确地编写方法?
【问题讨论】:
标签:
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 < 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 并将其传递给方法以递归调用它,因此您可以简单地使用此参数而不是创建额外的变量(例如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);
}
}