PR
更新:2025/03/11

Pythonで匿名関数(lambda)で再帰的な関数を作成する方法

はるか
はるか
Python で無名関数を使って再帰できる?
ふゅか
ふゅか
できるよ!通常は `def` を使うけど、`lambda` でも可能!ただし、名前を持たないことがネックになるね。

1. 匿名関数(lambda)で再帰的な関数の作成

Python では通常、関数を定義する際に def を用います。しかし、lambda(無名関数)を使用して再帰的な関数を作成することも可能です。ただし、匿名関数は名前を持たないため、関数自身を呼び出す方法が課題となります。

2. 再帰的な lambda 関数の実現方法

fix = (lambda f: (lambda x: x(x))(lambda x: f(lambda y: x(x)(y))))

ここで f は再帰を適用したい関数を受け取ります。

3. フィボナッチ数列を求める lambda 関数

フィボナッチ数列は、次のように定義される数列です。

\[ F(n) = \begin{cases} 1, & \text{if } n \leq 2 \\ F(n-1) + F(n-2), & \text{otherwise} \end{cases} \]

この再帰的な関数を lambda で実装し、再帰を可能にします。

# フィボナッチ数列を求める関数の定義
fib = fix(lambda f: lambda n: 1 if n <= 2 else f(n-1) + f(n-2))

# フィボナッチ数列の第10項を求める
print(fib(10))  # 出力: 55

このコードでは、fiblambda を使って定義し、再帰的に f(n-1) + f(n-2) を計算できるようにしています。

4. 階乗を求める lambda 関数

階乗(factorial)は、次のように定義されます。

\[ n! = \begin{cases} 1, & \text{if } n = 0 \\ n \times (n-1)!, & \text{otherwise} \end{cases} \]

この再帰的な計算を lambda 関数を使って表現すると、次のようになります。

# 階乗を求める関数の定義
factorial = fix(lambda f: lambda n: 1 if n == 0 else n * f(n-1))

# 階乗を求める
print(factorial(5))  # 出力: 120

このコードでは、factorial 関数を lambda で定義し、固定ポイントコンビネータを活用して n * f(n-1) という再帰的な計算を実行しています。

PR