Pythonでフィボナッチ数を求める方法:再帰と動的計画法の2つのアプローチを徹底解説
本記事では、「n番目のフィボナッチ数を計算する」という問題に対する解決策と考え方を、2つの異なるアプローチ(再帰的手法と動的計画法)のコード例とともにわかりやすく解説します。
問題の概要
今回の課題は、n番目のフィボナッチ数を求めることです。
フィボナッチ数列 Fn は、次の漸化式によって定義されます。
Fn = Fn-1 + Fn-2
初期値(シード値)は以下の通りです。
F0 = 0、F1 = 1
この問題を解くには、主に次の2つの方法があります。
- 再帰的なアプローチ
- 動的計画法によるアプローチ
アプローチ1:再帰的な手法
まずは、定義そのものをそのままコードに反映させた再帰的な実装を見てみましょう。関数が自分自身を呼び出すことで、フィボナッチ数を順に計算していきます。
サンプルコード
# 再帰的なアプローチ
def Fibonacci(n):
if n < 0:
print("フィボナッチ数は計算できません")
# 第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
このプログラムでは、すべての変数がグローバルスコープで宣言されています。

再帰的な手法はコードが直感的で理解しやすい一方、同じ計算を何度も繰り返すため、nが大きくなると処理時間が指数関数的に増加するという弱点があります。
アプローチ2:動的計画法による手法
次に紹介するのは、一度計算した結果を配列に保存して再利用する動的計画法(メモ化)のアプローチです。これにより、無駄な再計算がなくなり、効率が大幅に向上します。
サンプルコード
# 動的計画法によるアプローチ
Fib_Array = [0, 1]
def fibonacci(n):
if n < 0:
print("フィボナッチ数は計算できません")
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
こちらのプログラムでも、すべての変数はグローバルスコープで宣言されています。

2つのアプローチの比較
| 手法 | 時間計算量 | 特徴 |
|---|---|---|
| 再帰的手法 | O(2ⁿ) | コードはシンプルだが、nが大きいと非常に遅い |
| 動的計画法 | O(n) | 計算済みの値を再利用するため高速 |
実際の開発では、パフォーマンスを重視して動的計画法を選ぶのが一般的ですが、アルゴリズムの学習目的であれば、まず再帰的な実装から理解を深めるのがおすすめです。
まとめ
本記事では、Pythonを使ってn番目のフィボナッチ数を計算する2つのアプローチ——再帰的手法と動的計画法——について学びました。それぞれのメリットとデメリットを理解し、状況に応じて最適な方法を選択できるようにしておきましょう。
-
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:再帰
-
【Python】与えられた数がフィボナッチ数かどうかを判定する方法を解説
本記事では、以下の問題文に対する解決策について詳しく学んでいきます。 問題の定義 数値 n が与えられたとき、その数がフィボナッチ数であるかどうかを判定します。 ご存知のとおり、n番目のフィボナッチ数は「直前の2つのフィボナッチ数の和」として定義されます。しかし、この漸化式以外にも、フィボナッチ数には興味深い数学的な性質が存在します。 フィボナッチ数の判定に使える重要な性質 ある数 n がフィボナッチ数であるのは、次の条件が成り立つ場合、かつその場合に限られます。 5×n² + 4 が完全平方数である または 5×n² − 4 が完全平方数である つまり、上記のどちらか一方(または両方)が