2016-11-10 9 views
3

私は、任意の数のラムダ関数を構成する関数を記述しようとしています。ラムダを構成するRecursionError

私は2つの簡単なラムダ関数を持っています。構成する機能で

f = lambda x: x + 1 
g = lambda x: x**2 

私の試みはこれです:

def compose(*functions): 
    composed = lambda x: x # Function that returns input 
    for function in reversed(functions): 
     composed = lambda x: function(composed(x)) 
    return composed 

私の思考composed機能を作るたびに、その中に新しい機能が含まれ、機能の可変数をループしました。

は、その後、私は26ですが、代わりに、私が手

c = compose(f, g) 

だからc(5)を呼び出すとf(g(5))を返す必要がありますfの組成とg、ある機能を作ることができ

RecursionError: maximum recursion depth exceeded 

私は思いました中間変数を導入すると問題が解決する可能性があります。

def compose(*functions): 
    composed = lambda x: x # Function that returns input 
    for function in reversed(functions): 
     intermediate = lambda x: function(composed(x)) 
     composed = intermediate 
    return composed 

しかし、同じエラーが発生します。

これを修正する方法はありますか?

答えて

2

最初に、私はあなたのアプローチがのようにで終わると思っています。functionのラムダでは、繰り返しの最後に関数の最後の値しか取られません。第2に、composedは、第1の理由のためにも、やはり最後に再帰的に呼び出すことになる。 composed - ラムダ - composedの最後の値を呼び出します - それ自身!

def compose(*functions): 
    composed = lambda x: x 
    for function in reversed(functions): 
     composed = lambda x, function=function, composed=composed: function(composed(x)) 
    return composed 

print(compose(f, g)(5)) 
# 26 

しかし、あなたの全体的な問題はfunctools.reduceのために良いユースケースのようになります:

一つの可能​​性のある問題を修正する修正プログラムを各繰り返しでlambdacomposedfunctionをバインドすることで、

from functools import reduce 

def compose(*functions): 
    def inner(v): 
     return reduce(lambda x, y: y(x), reversed(functions), v) 
    return inner 

print(compose(f, g)(5)) 
# 26 
+1

良い解決策が、 OPの試行でバグを見つけられますか? –

+0

@ juanpa.arrivillagaそれを見て –

+0

ええ、ちょうどそれが遅いバインディングのためだったと思った。 –

関連する問題