2016-10-05 3 views
4
public static int fun(int n) { 
    if (n<=1) return 1; 
    else return (n + fun(n-1)); 
    } 

なぜですかfun(6)21を返しますか?私は再帰を可視化する方法再帰を理解するのが苦労

は以下の通りである:

6 + 5 = 11 
5 + 4 = 9 
4 + 3 = 7 
3 + 2 = 5 
2 + 1 = 3 
1  1 
11 + 9 + 7 + 5 + 3 + 1 = 36 

誰かがここで何が起こっているのか私に説明してもらえますか?

- 編集はSystem.out.println()を削除しました。コードを投稿したときに削除するのを忘れました。

私は自分自身に次のことを試してみました:

public static int fun(int n) { 
    if (n==1) return 2; 
    else return 2 * fun(n-1); 
} 

2 * fun(4) 
2 * (2 * fun(3)) 
2 * (2 * (2 * fun(2))) 
2 * (2 * (2 * (2 * fun(1)))) 
2 * 2 * 2 * 2 * 2 = 32 

が、これはそれを可視化する正しい方法ですか?

+2

Java最適化された末尾再帰 'fun(Integer.MAX_VALUE)'が有効な場合。 – Andreas

+2

nhouser9は以下の各ステップの概要を示しています。もともと再帰と同じ問題を抱えていましたが、スタックフレームの観点から考えてみてください。最初のフレームで 'fun(6)'を呼び出すと、 'fun(n-1)'を再帰呼び出しします。別のスタックフレームで実行されます。再帰の終わりに達すると( 'n <= 1')、スタックは巻き戻され、各再帰呼び出しの結果は前のものに戻されます。だから、あなたの集計は間違った順序で行われます。 – Nio

+0

@Andreas Javaはテールコールの最適化を行いません。 –

答えて

6

funへの各呼び出しは、return n + fun(n-1);の呼び出しを終了します。だから何が起こったのかを見てみましょう。

あなたは

があると評価され... 6 + (5 + (4 + fun(3)))と評価された... 6 + (5 + fun(4))と評価された... 6 + fun(5)に評価... fun(6)を呼び出します6 + (5 + (4 + (3 + fun(2)))) which ...

は0123と評価されます以降、fun(1) = 1以降、この

は、21と評価されます。

6

私はそれのようにそれを視覚化する方が簡単だと思う:

fun(6) = 
6 + fun(5) = 
6 + 5 + fun(4) = 
... 
6 + 5 + 4 + 3 + 2 + 1 = 
21 

基本的には、各再帰呼び出しは一歩近づい終了に私たちを移動し(nは< = 1)。最終結果は、終了に達すると計算することができます。

1
fun(6) = 6 + fun(5) 
     = 6 + 5 + fun(4) 
     = 6 + 5 + 4 + fun(3) 
     ... 
     = 6 + 5 + 4 + 3 + 2 + 1 = 21 
1

先頭行 "System.out.println(n +" "+(n-1));"変数 'n'の値のみを表示し、いかなる算術演算も含まない。

6> 1のように:この関数の

ステップ6 +楽しい(5)、

5> 1のように:6 + 5 +楽しい(4)、

4> 1そう:6 + 5 + 4 +楽しい(3)、そう

3> 1:6 + 5 + 4 + 3 +楽しい(2)、

2> 1のように:6 + 5 + 4 + 3 + 2 + fun(1)、

1> = 1ので:6 + 5 + 4 + 3 + 2 + 1

とのSUM:6 + 5 + 4 + 3 + 2 + 1 = 21私は私の説明があることを願っています

あなたにとって有益です。

関連する問題