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

Pythonの再帰関数でフィボナッチ数列を求める方法をわかりやすく解説

再帰(リカージョン)を使ってフィボナッチ数列を求めるには、まず値を引数として受け取る fibonacci_recursion という関数を定義します。この関数は、入力値のサイズを小さくしながら自分自身を繰り返し呼び出すことで、最終的な結果を導き出します。

以下に具体的な実装例を示します。

サンプルコード

def fibonacci_recursion(my_val):
   if my_val <= 1:
      return my_val
   else:
      return(fibonacci_recursion(my_val-1) + fibonacci_recursion(my_val-2))
num_terms = 12
print("The number of terms is ")
print(num_terms)
if num_terms <= 0:
   print("Enter a positive integer...")
else:
   print("The Fibonacci sequence is :")
   for i in range(num_terms):
      print(fibonacci_recursion(i))

実行結果

The number of terms is
12
The Fibonacci sequence is :
0
1
1
2
3
5
8
13
21
34
55
89

コードの解説

  • 引数として値を受け取る fibonacci_recursion 関数を定義します。
  • 再帰を終了させるためのベースケース(基本条件)を設定します。具体的には、引数が1以下の場合はそのまま値を返します。
  • それ以外の場合は、my_val-1my_val-2 を引数にして自分自身を再帰的に呼び出し、その戻り値を足し合わせます。
  • 関数の外側では、求めたい項数(ここでは12項)を変数に格納し、コンソールに表示します。
  • 項数が0以下の場合は正の整数を入力するよう促すメッセージを表示し、それ以外の場合はフィボナッチ数列の出力を行います。
  • for ループで範囲内の各数値を順番に処理し、そのたびに再帰関数を呼び出して結果を表示します。

注意点:計算量について

シンプルな再帰による実装は理解しやすい反面、同じ計算を何度も繰り返すため、項数が増えると処理時間が指数関数的に増大するという欠点があります。実用的な規模の数列を扱う場合は、メモ化(memoization)を活用するか、ループによる反復処理へ置き換えることで、パフォーマンスを大幅に改善できます。

  1. Pythonで正弦級数(sin x)の合計を求めるプログラム

    正弦級数とはある値 x が与えられたとき、sin(x) の級数の合計を計算することを考えてみましょう。正弦(サイン)級数は、次のように複数の項から構成される無限級数です。sine(x) = x − x^3/fact(3) + x^5/fact(5) − x^7/fact(7) …これは sin(x) のテイラー展開(マクローリン展開)に基づいた式で、fact(n) は n の階乗を表します。項数を増やすほど、実際の sin(x) の値に近い高精度な近似が得られます。このような級数の問題を解くには、まず角度を入力として受け取り、それをラジアンに変換します。その後、級数のすべての項を順番に処理し、

  2. Pythonで再帰関数を使って数値の累乗を計算する方法

    Pythonでは、再帰(リカーシブ)処理を利用することで、数値の累乗をシンプルに計算できます。本記事では、ユーザーから数値と指数を入力として受け取り、再帰関数によって累乗を求めるプログラムを紹介します。再帰による累乗計算の仕組み再帰とは、関数が自分自身を呼び出すことで処理を繰り返す手法です。累乗の計算では、「数値 × 数値^(指数-1)」という関係が成り立つため、指数を1つずつ減らしながら自分自身を呼び出すことで、最終的な結果を得られます。サンプルコード以下のプログラムは、ユーザーから数値(底)と指数を受け取り、再帰関数 rpower() を使って累乗を計算します。この関数は、数値を再帰的に繰