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
が、これはそれを可視化する正しい方法ですか?
Java最適化された末尾再帰 'fun(Integer.MAX_VALUE)'が有効な場合。 – Andreas
nhouser9は以下の各ステップの概要を示しています。もともと再帰と同じ問題を抱えていましたが、スタックフレームの観点から考えてみてください。最初のフレームで 'fun(6)'を呼び出すと、 'fun(n-1)'を再帰呼び出しします。別のスタックフレームで実行されます。再帰の終わりに達すると( 'n <= 1')、スタックは巻き戻され、各再帰呼び出しの結果は前のものに戻されます。だから、あなたの集計は間違った順序で行われます。 – Nio
@Andreas Javaはテールコールの最適化を行いません。 –