我目前正在学习Java中的递归。我已经编写了一些练习代码。
public class Tester{
public static void main(String[] args){
rec(5);
}
public static void rec(int x){
if(x<=0){
return;
}else{
System.out.print(x+" ");
rec(x-1);
}
}
}
// Output: 5 4 3 2 1
但是,如果现在用
System.out.print(x+" ");
切换rec(x-1);
,则会得到完全不同的输出,即相反:1 2 3 4 5
这怎么可能?我这样理解:
我们有整数
5
,我们遍历了该方法。 if语句不适用,因此我们将5
减小1
并得到x=4
,然后重复该方法(未达到打印状态,因此没有打印任何内容)。如前所述,我们对x=4
做同样的事情。如果该语句不适用,则将4
减少1
并重复该方法。我们重复直到得到那个x=0
。在这种情况下,我们返回,因此这是方法的结束。我根本不了解我们如何获得反向输出,甚至不知道为什么会有输出...? :s 最佳答案
好,让我们研究第一种情况
首先是print语句,然后是递归调用:
空运行:
x = 5 Prints 5 then calls rec(4)
x = 4 Prints 4 then calls rec(3)
x = 3 Prints 3 then calls rec(2)
x = 2 Prints 2 then calls rec(1)
x = 1 Prints 1 then calls rec(0)
x = 0 Base case reached, so method returns in the following sequence->
rec(1) -> rec(2) -> rec(3) -> rec(4) -> rec(5) ->main()
由于在这种情况下,递归调用之后不再需要执行任何语句,因此什么也没有发生,并且该方法开始返回
现在针对第二种情况:
首先是递归调用,然后是print语句
空运行:
x = 5 as x is not less than equal to 0 goes to rec(4) but print statement is now pending execution. It wont happen until the recursive call returns
x = 4 as x is not less than equal to 0 goes to rec(3) but again print is on hold
x = 3 as x is not less than equal to 0 goes to rec(2) but still print is on hold
x = 2 as x is not less than equal to 0 goes to rec(1) but still print is on hold
x = 1 as x is not less than equal to 0 goes to rec(0) but still print is on hold
x = 0 as x is now 0, rec(0) returns to rec(1)
现在rec(1)有一个待处理的打印语句,现在执行该语句的值为1
然后rec(2)有一个待处理的print语句,现在该语句的执行值为2
然后rec(3)有一个待处理的print语句,现在该语句的执行值为3
然后rec(4)有一个待处理的print语句,现在该语句的执行值为4
然后rec(5)有一个待处理的print语句,现在该语句的执行值为5
然后rec(5)返回main()
因此,在这种情况下,输出为1-> 2-> 3-> 4-> 5
在第一种情况下是5-> 4-> 3-> 2-> 1
希望这有助于您的理解:-)
关于java - 递归问题-我不明白为什么会得到反向输出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43572145/