更新: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
このコードでは、fib
を lambda
を使って定義し、再帰的に 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