n番目のフィボナッチ数を求めるPythonプログラム【再帰・動的計画法】
本記事では、n番目のフィボナッチ数を計算するPythonプログラムについて解説します。
フィボナッチ数とは?
フィボナッチ数とは、次の漸化式で定義される数列のことです。
Fn = Fn-1 + Fn-2
ただし、初期値は F0 = 0、F1 = 1 とします。
フィボナッチ数列の最初のいくつかの値は以下の通りです。
0, 1, 1, 2, 3, 5, 8, 13, ..................
フィボナッチ数は、再帰と動的計画法(Dynamic Programming)という2つの代表的な手法で求めることができます。それでは、それぞれの実装方法をPythonスクリプトで見ていきましょう。
方法1:再帰を使うアプローチ
コード例
# 再帰によるアプローチ
def Fibonacci(n):
if n<0:
print("Fibonacci can't be computed")
# 第1フィボナッチ数
elif n==1:
return 0
# 第2フィボナッチ数
elif n==2:
return 1
else:
return Fibonacci(n-1)+Fibonacci(n-2)
# メイン処理
n=10
print(Fibonacci(n))実行結果
34
宣言されたすべての変数のスコープは下図のように示されます。

この再帰的な実装では、各関数呼び出しがさらに2つの再帰呼び出しを生成するため、計算量は指数関数的な O(2n) になります。そのため、n が大きくなると処理が非常に遅くなる点に注意が必要です。
方法2:動的計画法を使うアプローチ
コード例
# 動的計画法によるアプローチ
Fib_Array = [0,1]
def fibonacci(n):
if n<0:
print("Fibonacci can't be computed")
elif n<=len(Fib_Array):
return Fib_Array[n-1]
else:
temp = fibonacci(n-1)+fibonacci(n-2)
Fib_Array.append(temp)
return temp
# ドライバープログラム
n=10
print(fibonacci(n))実行結果
34
宣言されたすべての変数のスコープは下図のように示されます。

この実装では、一度計算した値をリストにキャッシュするメモ化の考え方を取り入れています。これにより、同じ値を何度も再計算する無駄がなくなり、計算量は O(n) まで大幅に改善されます。
まとめ
本記事では、再帰と動的計画法という2つのアプローチを用いて、n番目のフィボナッチ数を計算するPythonプログラムを紹介しました。小さな n であれば単純な再帰でも十分ですが、パフォーマンスを重視する場合は、メモ化による動的計画法を採用するのがおすすめです。
-
Pythonでn番目のカタラン数を計算するプログラム|再帰法と動的計画法
本記事では、n番目のカタラン数を計算する方法について解説します。 カタラン数(Catalan number)は、次の漸化式で定義される自然数の数列です。 $$C_{0}= 1,\quad C_{n+1}=\displaystyle\sum\limits_{i=0}^n C_{i}C_{n-i}\quad (n \geq 0)$$ n = 0, 1, 2, 3, … に対するカタラン数は、1, 1, 2, 5, 14, 42, 132, 429, … と続きます。 カタラン数は、再帰法と動的計画法のどちらのアプローチでも求めることができます。それでは、それぞれの実装方法を見ていきましょう。 方法
-
【Python】与えられた数がフィボナッチ数かどうかを判定する方法を解説
本記事では、以下の問題文に対する解決策について詳しく学んでいきます。 問題の定義 数値 n が与えられたとき、その数がフィボナッチ数であるかどうかを判定します。 ご存知のとおり、n番目のフィボナッチ数は「直前の2つのフィボナッチ数の和」として定義されます。しかし、この漸化式以外にも、フィボナッチ数には興味深い数学的な性質が存在します。 フィボナッチ数の判定に使える重要な性質 ある数 n がフィボナッチ数であるのは、次の条件が成り立つ場合、かつその場合に限られます。 5×n² + 4 が完全平方数である または 5×n² − 4 が完全平方数である つまり、上記のどちらか一方(または両方)が