public void numbers(int n)
{
if(n>0)
{
System.out.print(n);
numbers(n-2);
System.out.print(n);
}
}
我有上面的代码段。 当我拨打电话时(5) 它给了我一个输出:531135
我理解到531.但是在此之后,当n <0时,如何能够达到第二个印刷语句。为什么这样135?
我真的对此没有任何线索,请帮我详细解释和干运行。
如果我问傻事请原谅我。
谢谢
答案 0 :(得分:0)
我要尝试追踪该计划正在做什么:
numbers(5)
5>0
print(5)
numbers(3)
3>0
print(3)
numbers(1)
1>0
print(1)
numbers(-1)
-1>0
print(1)
print(3)
print(5)
如您所见,每个函数调用的第二个print
- 语句不依赖于任何if
(递归调用的if
并不重要调用方法)。因此,每个数字总是打印两次(或从不)。
我希望这一点有点明白。
答案 1 :(得分:0)
您可以使用调试器来完成该程序。下面我修改了
你的程序并添加了一些显示各种状态的println()
该计划。我还添加了r
来显示递归级别和__
帮助缩进输出。看看这现在是否有助于您理解
更好。
public class NumberRecursion {
public static void main(String[] args) {
numbers(5);
}
private static int r = 0; // recursion level
private static String __ = ""; // indent prefix
public static void numbers(int n)
{
r++; // recursion level
__ += " "; // indent by another four spaces
System.out.println(__+ "[" + r + "] numbers(" + n + ") entered");
if(n>0) // L3
{
System.out.println(__+ "[" + r + "] L3 tested true (and n=" + n + ")");
System.out.println(n); // P1
System.out.println(__+ "[" + r + "] about to invoke numbers(" + (n-2) + ")");
numbers(n-2); // N
System.out.println(__+ "[" + r + "] numbers(" + (n-2) + ") just finished");
System.out.println(n); // P2
} else {
System.out.println(__+ "[" + r + "] L3 tested false (and n=" + n + ")");
}
System.out.println(__+ "[" + r + "] numbers(" + n + ") about to return");
__ = __.substring(0, __.length()-4);
// indent now has four less spaces
r--; // recursion level
}
}
这个程序的输出就是这个。在此输出中,数字以平方为单位
括号(例如[1]
)是递归的级别。
[1] numbers(5) entered
[1] L3 tested true (and n=5)
5
[1] about to invoke numbers(3)
[2] numbers(3) entered
[2] L3 tested true (and n=3)
3
[2] about to invoke numbers(1)
[3] numbers(1) entered
[3] L3 tested true (and n=1)
1
[3] about to invoke numbers(-1)
[4] numbers(-1) entered
[4] L3 tested false (and n=-1)
[4] numbers(-1) about to return
[3] numbers(-1) just finished
1
[3] numbers(1) about to return
[2] numbers(1) just finished
3
[2] numbers(3) about to return
[1] numbers(3) just finished
5
[1] numbers(5) about to return