プログラミング
 Computer >> コンピューター >  >> プログラミング >> プログラミング

フィボナッチ数列を生成する方法|動的計画法による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)となります。同じ項を何度も再計算してしまう単純な再帰実装(指数時間かかる)と比較すると、大幅に高速に動作します。

  1. Java 9のJShellでフィボナッチ数列を実装する方法を解説

    JShellとは? JShellは、Java 9で導入されたJavaシェルツールです。Javaコードを入力すると、その結果を即座に表示してくれるため、コードの動作確認や学習に非常に便利なツールとなっています。 JShellはREPL(Read-Evaluate-Print-Loop:読み込み・評価・出力・ループ)と呼ばれる仕組みを採用しており、コマンドラインから直接実行できます。クラスやmainメソッドを定義しなくても、単独の文や式を手軽に試せるのが大きな特徴です。 フィボナッチ数列とは フィボナッチ数列とは、「各項が直前の2つの数の和」という規則で構成される数列のことです。具体的には以下の

  2. Pythonのラムダ式でフィボナッチ数列を生成する2つの方法

    フィボナッチ数列は、自然界の多くの現象を説明することでも知られる、非常に有名な数学的数列です。0と1から始まり、「直前の2項の合計」を次の項として加えていくことで数列が伸びていきます。本記事では、Pythonのラムダ式(無名関数)を使って、指定した個数のフィボナッチ数列を生成する2つの方法を紹介します。 方法1:sum関数とmap関数を組み合わせる まずはmap関数を使い、リストの各要素にラムダ関数を適用する方法です。リストのスライスで直前の2項を取り出してsumで合計し、その結果をリストに追加していきます。range関数で生成する項数を制御するのがポイントです。 サンプルコード def fi