Pythonで再帰関数|メリット・デメリットや階乗やフィボナッチ級数の実装を紹介する

スポンサーリンク

この記事では、Pythonの再帰関数の書き方を学びます。

スポンサーリンク

そもそも再帰関数って何?

ある関数が自分自身を呼び出すように定義されている場合、再帰的関数と呼ばれます。

他の言語と同様に、Pythonでも再帰的関数を使う事ができます。

再帰は、繰り返しのたびに関数が呼び出されるforループと非常によく似ています

そのため、Pythonの再帰関数の代わりとして、forループを使用することができます

しかし、プログラマによってはforループよりも再帰を好む人もいます。

これは好みの問題でもありますが、状況によってforループの方が分かりやすいコードになったり、逆に再帰関数の方がシンプルなコードになったりするので、一長一短ですね。

Pythonの再帰関数のメリット・デメリット

再帰関数には以下のメリットがあります。

  • 再帰によってコードの行数を減らせることが多い。
  • 再帰のコードはシンプル。
  • ある程度理解が深まれば、関数で再帰を使うのは簡単。

逆に再帰関数のデメリットは以下の通りでうs。

  • 正しく実装しないと、関数が終了しない。
  • forループと比較すると、再帰を理解することは難しい。

    Python再帰関数の例

    Pythonの再帰関数の例をいくつか見てみましょう。

1. 整数の階乗

ある整数の階乗は、1からその整数までの数を掛け合わせることで計算されます。

例えば、10の階乗は123…910となります。

まずは、forループを使った階乗関数の書き方を見てみましょう。

def factorial(n):
    result = 1

    for i in range(1 , n + 1):
        result = result * i

    return result

print(f'Factorial of 10 = {factorial(10)}')
print(f'Factorial of 5 = {factorial(5)}')

今度は、factor()関数を再帰関数を使って実装していきます。

def factorial(n):
    if n == 1:
        return 1
    else:
        return n * factorial(n- 1)

print(f'Factorial of 10 = {factorial(10)}')
print(f'Factorial of 5 = {factorial(5)}')

結果は同じですが、再帰関数の方がよりシンプルに実装できます。

Factorial of 10 = 3628800
Factorial of 5 = 120

2. Pythonの再帰関数を使ってフィボナッチ級数を実装する

フィボナッチ級数とは、各数値が先行する2つの数値の和となるような数値の並びのことです。

例えば、-1, 1, 2, 3, 5, 8, 13, 21 と言う風なものです。

まずは、ループを使ってフィボナッチ級数の数値を返す関数を見てみましょう。

def fibonacci(n):
    """ Returns Fibonacci Number at nth position using loop"""

    if n == 0:
        return 0
    if n == 1:
        return 1

    i1 = 0
    i2 = 1
    num = 1

    for x in range(1, n):
        num = i1 + i2
        i1 = i2
        i2 = num

    return num

for i in range(10):
          print(fibonacci(i), end=" ")
# 出力は以下の通り: 0 1 1 2 3 5 8 13 21 34

フィボナッチ級数をfor文で書くと、結構複雑な感じになりますね。

今度は、再帰関数を使ってフィボナッチ級数を書いていきます。

def fibonacci(n):
    """ Returns Fibonacci Number at nth position using recursion"""
    if n == 0:
        return 0
    elif n == 1:
        return 1
    else:
        return fibonacci(n- 1) + fibonacci(n- 2)

for i in range(10):
    print(fibonacci(i), end=" ")
# 出力は以下の通り: 0 1 1 2 3 5 8 13 21 34

フィボナッチ級数の様な複雑な計算の場合は、再帰関数の方がシンプルに実装ができます。

タイトルとURLをコピーしました