[英]How does this recursive function get to this output?
当我为n = 5运行这段代码时,我得到的输出是“ 5 3 1 1 3 5”,我得到了5 3 1部分,但是在那之后n = -1,但是当我使用调试器运行代码时,当n = -1转到numbers(n-2);
之后的行numbers(n-2);
即System.out.prt(n+ "");
即使该语句包含在if块中。
为什么会这样?
public void numbers(int n)
{
if(n>0)
{
System.out.print(n+" ");
numbers(n-2);
System.out.print(n+" ");
}
}
TLDR:当n = -1时System.out.prt(n+ "");
即使它位于if块中,该块仅在n> 0时运行。
任何帮助将非常感激。 提前致谢!
删除最终的System.out.print(n +“”); 递归数字调用后,它返回n的原始值并再次打印。
它从最深的级别冒泡回去,在最深的级别上它两次打印1次,直到再次打出编号3的呼叫,再打出5个。
如果希望它在第一次打印后更新值,则必须通过执行n- = 2而不是n-2来更新变量n
对于n == 5
,这是幕后发生的事情:
numbers(5);
if(5 > 0)--> true :
System.out.print(5 + " "); // (1)
numbers(3);
| if(3 > 0)--> true :
| System.out.print(3 + " "); // (2)
| numbers(1);
| | if(1 > 0)--> true :
| | System.out.print(1 + " "); // (3)
| | numbers(-1);
| | System.out.print(1 + " "); // (4)
| System.out.print(3 + " "); // (5)
System.out.print(5 + " "); // (6)
注意每个数字应该如何打印两次:
System.out.print(n + " "); // print once
numbers(n-2);
System.out.print(n + " "); // print twice
5 first system.out then number(5-2)
|
----> 3 first system.out then number(5-2)
|
----->1 first system.out then number(5-2)
(smaller than 0) , returning
|
1 second system.out
|
3<---- second system.out
|
5<--------- second system.out
在n = -1之后,递归调用将结束并返回到调用方方法以继续。 找到的第一个命令是打印。
如果尝试使用调试器进行调试,您将看到它的合理性。
Java将方法调用维护到堆栈中,并在输出第一个5,3,1之后打印该方法调用,然后继续执行其余调用,并从堆栈中打印1,3,5(首先拾取堆栈中的最后一个调用)。
遵循递归堆栈。
具有输出流的堆栈表示:
------------------------->
5 3 1
num(5)--> num(3) --> num(1) --> num(-1) --> void
5 3 1
<-------------------------
现在,由于numbers(-1)不满足if条件,因此程序控件来自if块,并返回void。 现在开始弹出堆栈(递归):5 3 1 1 3 5.这就是您得到的输出,并且可以预期。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.