简体   繁体   English

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

[英]In recursive fibonacci program why the left subtree is called before the right one(something like postorder traversal)?

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));
    }
}

Output: 输出:

fib(5) called fib(5)称为
fib(4) called fib(4)称为
fib(3) called fib(3)称为
fib(2) called fib(2)称为
fib(1) called fib(1)称为
fib(0) called fib(0)称为
returning to fib(2) 返回fib(2)
fib(1) called fib(1)称为
returning to fib(3) 返回fib(3)
fib(2) called fib(2)称为
fib(1) called fib(1)称为
fib(0) called fib(0)称为
returning to fib(2) 返回fib(2)
returning to fib(4) 返回fib(4)
fib(3) called fib(3)称为
fib(2) called fib(2)称为
fib(1) called fib(1)称为
fib(0) called fib(0)称为
returning to fib(2) 返回fib(2)
fib(1) called fib(1)称为
returning to fib(3) 返回fib(3)
returning to fib(5) 返回fib(5)
fib(5): 5 fib(5):5

PS: Why fib(n-1) is called before fib(n-2)? PS:为什么在fib(n-2)之前调用fib(n-1)? 树状图

This can be explained by the following section of JLS - JLS以下部分可以对此进行解释-

The Java programming language guarantees that the operands of operators appear to be evaluated in a specific evaluation order, namely, from left to right. Java编程语言保证运算符的操作数似乎按照特定的评估顺序(即从左到右)进行评估。

In your case, the left operand is the call to fib(n-1) , so it will be fully evaluated to compute final value, and only then the right operation will be evaluated. 在您的情况下,左操作数是对fib(n-1)的调用,因此将对它进行完全评估以计算最终值,然后才对右操作进行评估。

Because the first part that is executed, is called first, for example if you so this : 因为执行的第一部分首先被调用,例如,如果您这样做:

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

Then dfs(x-1) will called first, so dfs will be called again, and dfs(x-1) will called one more time because it's the first instruction and so on until last dfs(x-1) is called then the program continue with dfs(x-2). 然后将首先调用dfs(x-1),因此将再次调用dfs,并且dfs(x-1)将再调用一次,因为它是第一条指令,依此类推,直到最后一次调用dfs(x-1),然后再调用程序继续使用dfs(x-2)。

I hope it helps. 希望对您有所帮助。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM