フィボナッチ数列を生成する方法|動的計画法によるC++実装を解説
フィボナッチ数列とは
フィボナッチ数列は、以下のように各項が直前の2つの項の和となる数列です。
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55,……
この数列では、第n項が(n-1)番目の項と(n-2)番目の項の合計として定義されます。
フィボナッチ数列の生成には再帰的なアプローチも利用できますが、動的計画法(DP)を使えば手順はさらにシンプルになります。計算済みのフィボナッチ数をすべて表(配列)に格納しておき、その表を参照することで、以降の項を効率よく求められるのがポイントです。
入力と出力
入力: 項数を入力として受け取る。例:10 出力: Enter number of terms: 10 10th Fibonacci Terms: 55
アルゴリズム
genFiboSeries(n)
入力: 最大項数 n
出力: 第n項のフィボナッチ数
Begin
define array named fibo of size n+2
fibo[0] := 0
fibo[1] := 1
for i := 2 to n, do
fibo[i] := fibo[i-1] + fibo[i-2]
done
return fibo[n]
End
C++による実装例
#include<iostream>
using namespace std;
int genFibonacci(int n) {
int fibo[n+2]; // フィボナッチ数を格納する配列
// 数列の0番目と1番目はそれぞれ0と1
fibo[0] = 0;
fibo[1] = 1;
for (int i = 2; i <= n; i++) {
fibo[i] = fibo[i-1] + fibo[i-2]; // 直前の2項からi番目の項を生成
}
return fibo[n];
}
int main () {
int n;
cout << "Enter number of terms: "; cin >>n;
cout << n<<" th Fibonacci Terms: "<<genFibonacci(n)<<endl;
}
実行結果
Enter number of terms: 10 10th Fibonacci Terms: 55
計算量について
この動的計画法によるアプローチでは、各項を一度だけ計算するため時間計算量はO(n)、結果を格納する配列が必要なため空間計算量もO(n)となります。同じ項を何度も再計算してしまう単純な再帰実装(指数時間かかる)と比較すると、大幅に高速に動作します。
-
Java 9のJShellでフィボナッチ数列を実装する方法を解説
JShellとは? JShellは、Java 9で導入されたJavaシェルツールです。Javaコードを入力すると、その結果を即座に表示してくれるため、コードの動作確認や学習に非常に便利なツールとなっています。 JShellはREPL(Read-Evaluate-Print-Loop:読み込み・評価・出力・ループ)と呼ばれる仕組みを採用しており、コマンドラインから直接実行できます。クラスやmainメソッドを定義しなくても、単独の文や式を手軽に試せるのが大きな特徴です。 フィボナッチ数列とは フィボナッチ数列とは、「各項が直前の2つの数の和」という規則で構成される数列のことです。具体的には以下の
-
Pythonのラムダ式でフィボナッチ数列を生成する2つの方法
フィボナッチ数列は、自然界の多くの現象を説明することでも知られる、非常に有名な数学的数列です。0と1から始まり、「直前の2項の合計」を次の項として加えていくことで数列が伸びていきます。本記事では、Pythonのラムダ式(無名関数)を使って、指定した個数のフィボナッチ数列を生成する2つの方法を紹介します。 方法1:sum関数とmap関数を組み合わせる まずはmap関数を使い、リストの各要素にラムダ関数を適用する方法です。リストのスライスで直前の2項を取り出してsumで合計し、その結果をリストに追加していきます。range関数で生成する項数を制御するのがポイントです。 サンプルコード def fi