2017-02-02 4 views
1
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)); 
    } 
} 

出力:再帰フィボナッチプログラムでは、なぜ、左サブツリーが右のものよりも前に呼び出されるのですか(ポストオーダートラバーサルのようなもの)?

呼ば(5)FIBと呼ばれる(4)
FIBと呼ばれる(3)
FIB
FIBは、(1)
FIBと呼ばれる呼ばれる(2)
FIB (0)
fib(2)に戻る
fib(1)
fib(3)012に戻る(2) FIBは呼ば
FIB(0)
がFIBに戻ると呼ばれる呼ばれる(1)
FIB(2)(4)
FIB(3)
FIB呼ばFIBに戻る
(2) 5(FIBに戻る
(0)FIBに戻る
と呼ば
FIBと呼ばれる(1)
FIBと呼ばれる(2)
FIB(1)〜(3)をFIBに戻る
と呼ば)
fib(5):5

PS:fib(n-1)がfib(n-2)より前に呼び出されるのはなぜですか? Tree Diagram

答えて

3

これはfollowing section of JLSによって説明することができます -

Javaプログラミング言語は 演算子のオペランドは、左から右へ、すなわち 、特定の評価順に評価されるように見えることを保証します。

あなたのケースでは、左側のオペランドはfib(n-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)を続けます。

私はそれが役に立ちそうです。

関連する問題