JavaScriptで再帰関数を使ってフィボナッチ数列を生成する方法
本記事では、再帰(リカージョン)を活用してフィボナッチ数列を生成するJavaScriptの関数の実装方法を解説します。
実装する関数の仕様
今回作成するのは、引数として数値 n を受け取り、フィボナッチ数列の最初の n 個の要素を配列として返す再帰関数 fibonacci() です。
再帰処理では、デフォルトパラメータを利用することで、外部から補助的な値を渡す必要がなく、シンプルな呼び出しを実現できます。具体的には、以下のような役割を持つパラメータを用意します。
n: 残りの生成回数res: これまでに生成された数列を格納する配列count: 現在のフィボナッチ数last: 直前のフィボナッチ数
コード例
const fibonacci = (n, res = [], count = 1, last = 0) => {
if(n){
return fibonacci(n-1, res.concat(count), count+last, count);
};
return res;
};
console.log(fibonacci(8));
console.log(fibonacci(0));
console.log(fibonacci(1));
console.log(fibonacci(19));動作の仕組み
この関数は、n が 0 より大きい間、自身を再帰的に呼び出します。各呼び出しで現在の count の値を結果配列に追加し、次のフィボナッチ数(count + last)と直前の数(count)を更新して引き渡します。n が 0 になると再帰が終了し、蓄積された配列が返されます。
なお、n = 0 を渡した場合は空の配列が返され、境界条件も正しく処理されます。
実行結果
コンソールには以下のように出力されます。
[ 1, 1, 2, 3, 5, 8, 13, 21 ] [] [ 1 ] [ 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181 ]
まとめ
このように、アロー関数とデフォルトパラメータを組み合わせることで、余分なヘルパー関数やループ処理なしに、簡潔で読みやすい再帰的なフィボナッチ数列の実装が可能になります。ただし、非常に大きな n を扱う場合にはスタックオーバーフローのリスクがあるため、実用的な規模での使用が推奨されます。
-
【初心者向け】JavaScriptのfor...ofループの使い方を実例つきで解説
JavaScriptのfor...ofループは、配列、文字列、配列風オブジェクト(Array-like objects)、NodeListなど、反復可能(イテラブル)なオブジェクトの要素を先頭から順番に1つずつ取り出して処理するための構文です。 インデックスの管理が不要なため、従来のforループやforEachメソッドと比べてコードが簡潔になり、可読性や保守性が向上するというメリットがあります。 for...ofループの基本構文 for (変数 of 反復可能オブジェクト) { // 各要素に対して実行したい処理 } サンプルコード 次の例では、for...ofループを使って文
-
JavaScriptの「for...in」ステートメントとは?オブジェクトのプロパティをループ処理する方法を解説
JavaScriptのfor...in文は、オブジェクトが持つすべてのプロパティ(列挙可能なプロパティ)を順番に取り出して処理するためのループ構文です。オブジェクト内の各キー(プロパティ名)にアクセスしながら、対応する値を取得したい場合に非常に便利です。for...inの基本的な構文for (let 変数名 in オブジェクト) { // 各プロパティに対して実行したい処理 }ループ変数には、各反復ごとにオブジェクトのプロパティ名(キー)が文字列として代入されます。値そのものを取得するには、「オブジェクト[変数名]」のようにブラケット記法を使ってアクセスします。サンプルコード以下は、for