在递归的斐波纳契程序中,为什么左子树在右子树之前被调用(类似于后序遍历)?

时间:2017-02-02 16:25:52

标签: java recursion fibonacci

package fibonacci;

public class Fib {

    static int fib(int n)
    {
        System.out.println("fib(" + n + ") called");
        if(n<=1)
        {
            return n;
        }
        int temp =  fib(n-1) + fib(n-2);
        System.out.println("returning to fib(" + n +")" );
        return temp;
    }
    public static void main(String[] args)
    {
        System.out.println("fib(5): " + fib(5));
    }
}

输出:

fib(5)称为
fib(4)称为 fib(3)称为 fib(2)称为 fib(1)称为
fib(0)称为
回到fib(2)
fib(1)称为
回到fib(3)
fib(2)称为 fib(1)称为
fib(0)称为
回到fib(2)
回到fib(4)
fib(3)称为 fib(2)称为 fib(1)称为
fib(0)称为
回到fib(2)
fib(1)称为
回到fib(3)
回到fib(5)
fib(5):5

PS:为什么在fib(n-2)之前调用fib(n-1)?Tree Diagram

2 个答案:

答案 0 :(得分:4)

这可以通过following section of JLS -

来解释
  

Java编程语言保证了操作数   运算符似乎在特定的评估顺序中进行评估,   即,从左到右。

在你的情况下,左操作数是对fib(n-1)的调用,因此它将被完全评估以计算最终值,然后才会评估正确的操作。

答案 1 :(得分:0)

因为执行的第一部分首先被调用,例如,如果您这样做:

void dfs(int x) {
   dfs(x-1);
   dfs(x-2);
}

然后将首先调用dfs(x-1),因此将再次调用dfs,并且dfs(x-1)将再次调用,因为它是第一条指令,依此类推,直到最后一条dfs(x -1)被调用然后程序继续dfs(x-2)。

我希望它有所帮助。