我目前正在学习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/

10-13 07:30