<一覧に戻る

再帰の基本とPythonでの実装

再帰は、関数が自分自身を呼び出すことによって問題を解決する手法です。この手法は、特に問題が自己相似的である場合に非常に効果的です。再帰を理解するためには、基本的な構造と、適切に終了条件を設定することが重要です。

再帰の基本構造

再帰関数は、通常以下の2つの部分で構成されています。

  1. 基本ケース(終了条件): 再帰を停止する条件です。これがないと、関数は無限に自分自身を呼び続けることになります。
  2. 再帰的ケース: 問題を小さな部分問題に分割し、再帰的に解決する部分です。

以下に、再帰関数の基本的な構造を示します。

def recursive_function(parameter):
    if base_case_condition(parameter):
        return base_case_result
    else:
        return recursive_function(modified_parameter)

再帰を使ったサンプルコード: 階乗の計算

階乗は、自然数 n の階乗を n! と表し、n が 0 または 1 のときは 1、その他の n に対しては n × (n-1)! と定義されます。

以下は、再帰を使用して階乗を計算する Python のコードです。

def factorial(n):
    # 基本ケース
    if n == 0 or n == 1:
        return 1
    else:
        # 再帰的ケース
        return n * factorial(n - 1)

# テスト
print(factorial(5))  # 出力: 120

コード解説

  1. 基本ケース: if n == 0 or n == 1: の部分で、n が 0 または 1 の場合、階乗は 1 であるとしています。
  2. 再帰的ケース: return n * factorial(n - 1) では、n の階乗を n と (n-1) の階乗の積として計算しています。この関数は、n が 0 または 1 になるまで自分自身を呼び出し続けます。

再帰を使ったサンプルコード: フィボナッチ数列

フィボナッチ数列は、最初の 2 つの数が 0 と 1 で、以降の数は前の 2 つの数の和となる数列です。フィボナッチ数列の n 番目の数は、次のように定義されます。

  • fib(0) = 0
  • fib(1) = 1
  • fib(n) = fib(n-1) + fib(n-2) (n >= 2)

以下は、再帰を使用してフィボナッチ数列の n 番目の数を計算する Python のコードです。

def fibonacci(n):
    # 基本ケース
    if n == 0:
        return 0
    elif n == 1:
        return 1
    else:
        # 再帰的ケース
        return fibonacci(n - 1) + fibonacci(n - 2)

# テスト
print(fibonacci(6))  # 出力: 8

コード解説

  1. 基本ケース: if n == 0:elif n == 1: の部分で、n が 0 または 1 の場合の結果を返します。
  2. 再帰的ケース: return fibonacci(n - 1) + fibonacci(n - 2) では、n 番目のフィボナッチ数を、n-1 番目と n-2 番目のフィボナッチ数の和として計算しています。

再帰の利点と欠点

利点

  • 簡潔さ: 再帰を使うことで、コードが短く、読みやすくなることが多い。
  • 自然な問題分割: 再帰は自己相似な問題に対して自然なアプローチを提供する。

欠点

  • パフォーマンス: 再帰的な計算には、特に重複する計算が多い場合に時間がかかることがある。
  • スタックオーバーフロー: 深い再帰は、スタックメモリを消費しすぎて、スタックオーバーフローを引き起こす可能性がある。

まとめ

再帰は、問題を分割して解決する強力な手法です。基本ケースと再帰的ケースを正しく設定することで、さまざまな問題を効率的に解決できます。次のステップとして、再帰的アルゴリズムの応用例について学んでいきましょう。

出力結果: