フィボナッチ再帰関数の「働き」は?
2023-10-13 23:41:31
質問
私はJavascriptの初心者で、それを読んでいるときに、関数の再帰について説明した章にたどり着きました。 それはフィボナッチ数列のn番目の数を見つけるために、例の関数を使用していました。 コードは次のとおりです。
function fibonacci(n) {
if (n < 2){
return 1;
}else{
return fibonacci(n-2) + fibonacci(n-1);
}
}
console.log(fibonacci(7));
//Returns 21
この関数が何をしているのか、正確に把握することができません。 誰かここで起こっていることを説明できますか? 5行目で、関数が自分自身を呼び出すところで行き詰っています。 ここで何が起こっているのでしょうか?
どのように解決するのですか?
関数を自分自身の観点から定義していますね。一般的には
fibonnaci(n) = fibonnaci(n - 2) + fibonnaci(n - 1)
. この関係をコードで表現しているだけです。ですから
fibonnaci(7)
を観察することができます。
-
fibonacci(7)
はfibonacci(6)
+fibonacci(5)
-
fibonacci(6)
はfibonacci(5)
+fibonacci(4)
-
fibonacci(5)
はfibonacci(4)
+fibonacci(3)
-
fibonacci(4)
はfibonacci(3)
+fibonacci(2)
-
fibonacci(3)
はfibonacci(2)
+fibonacci(1)
-
fibonacci(2)
はfibonacci(1)
+fibonacci(0)
-
fibonacci(1)
は 1 に等しい -
fibonacci(0)
は 1 に等しい
を評価するために必要なパーツがすべて揃いました。
fibonacci(7)
を評価するのに必要なパーツがすべて揃いました。注目すべきは
基本ケース
--
return 1
いつ
n < 2
-- はこれを可能にするものです。これは再帰を停止させ、スタックを展開して各ステップで返している値を合計する処理を開始できるようにするものです。このステップがなければ
fibonacci
を呼び続け、最終的にプログラムがクラッシュしてしまいます。
これを説明するいくつかのロギングステートメントを追加するのに役立つかもしれません。
function fibonacci(n, c) {
var indent = "";
for (var i = 0; i < c; i++) {
indent += " ";
}
console.log(indent + "fibonacci(" + n + ")");
if (n < 2) {
return 1;
} else {
return fibonacci(n - 2, c + 4) + fibonacci(n - 1, c + 4);
}
}
console.log(fibonacci(7, 0));
出力します。
fibonacci(7)
fibonacci(5)
fibonacci(3)
fibonacci(1)
fibonacci(2)
fibonacci(0)
fibonacci(1)
fibonacci(4)
fibonacci(2)
fibonacci(0)
fibonacci(1)
fibonacci(3)
fibonacci(1)
fibonacci(2)
fibonacci(0)
fibonacci(1)
fibonacci(6)
fibonacci(4)
fibonacci(2)
fibonacci(0)
fibonacci(1)
fibonacci(3)
fibonacci(1)
fibonacci(2)
fibonacci(0)
fibonacci(1)
fibonacci(5)
fibonacci(3)
fibonacci(1)
fibonacci(2)
fibonacci(0)
fibonacci(1)
fibonacci(4)
fibonacci(2)
fibonacci(0)
fibonacci(1)
fibonacci(3)
fibonacci(1)
fibonacci(2)
fibonacci(0)
fibonacci(1)
同じインデントレベルの値は、前のインデントレベルの結果を生成するために合計されます。
関連
-
[解決済み】再帰使用時のOcamlエラーUnbound Value
-
[解決済み] 再帰使用時のOcaml Error Unbound Value
-
[解決済み] 再帰的な関数をフローチャートで表現するには?
-
[解決済み] 最後の関数の再帰呼び出しで「scheme application not a procedure」と表示された
-
[解決済み] Lispで再帰関数はどのように動作するのですか?
-
[解決済み] Java再帰的フィボナッチ数列
-
[解決済み] 再帰とループの比較
-
[解決済み] foldrとfoldl(またはfoldl')の意味するところ
-
[解決済み] 再帰的関数の仕組みを理解する
-
[解決済み] 再帰性の実例【非公開
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】MIPSアセンブリを使用した再帰的な関数
-
[解決済み] リストを反転させるにはどうしたらいいですか?
-
[解決済み] 再帰的な関数をフローチャートで表現するには?
-
[解決済み] 最後の関数の再帰呼び出しで「scheme application not a procedure」と表示された
-
[解決済み] Fatal error.の解決方法 PHPの「Fatal error: Maximum function nesting level of '100' reached, aborting!
-
[解決済み] Lispで再帰関数はどのように動作するのですか?
-
[解決済み] 再帰とループの比較
-
[解決済み] 再帰から反復への道
-
[解決済み] foldrとfoldl(またはfoldl')の意味するところ
-
[解決済み] 再帰性の実例【非公開