4

こんにちは、私は関数型プログラミングが初めてです。私がしたことは

>>> g=lambda x:x*2
>>> f=g
>>> g=lambda x:f(f(x))
>>> g(9)
36

現在、非g終了の再帰関数として作成されているのではなくg(x)、結果を返す新しい関数に変換されていますg(g(x))

>>> f=g
>>> g=lambda x:f(f(x))
>>> f(8)
RuntimeError: maximum recursion depth exceeded

g(x) の最初の定義によるとg、結果を返す関数に変換されることを期待していました。g(g(g(x)))なぜそうしないのですか?g(g(g(...(g(x))....)))このようにして特定の回数の繰り返しになる新しい関数を作成することは可能ですか?

4

3 に答える 3

6

f = g2度目にすると f は になりますlambda x: f(x)。クロージャーは、値ではなく名前で作成されます。


これは、ヘルパー関数を使用すると簡単になります。

def compose(f, g):
    return lambda x: f(g(x))

square = lambda x:x*2
g = square
for i in xrange(4):
    g = compose(g, square)
于 2012-09-14T16:37:51.510 に答える
4

In python, variables are names mapped to values, not values themselves (everything is a reference). Also, you can think of lambda as storing text that can be evaluated. The following will illustrate

a = 2
f = lambda x: a*x
f(2) # This gives 4
a = 3
f(2) # This gives 6

This should clear up why you are getting infinite recursion.

In answer to your question about recursing, here is a little hack that might do

g = lambda x, n: n > 0 and g(x, n-1)**2 or x

Then g(2,3) would be (((2)^2)^2)^2 = 256.

于 2012-09-14T16:50:20.597 に答える
2

これ

g=lambda x:x*2
f=g
g=lambda x:f(x)

次と同等です。

f=lambda x:x*2
g=lambda x:f(x)

を呼び出すと、グローバル (または囲んでいる) スコープで定義されているgものをすべて取得します。f

あなたが期待しているのは次のようなものです:

f=lambda x:x*2
g=lambda x, f=f:f(x)

lambda これにより、式が評価された時点で、外側のスコープで f の値が取得されます。

于 2012-09-14T16:57:59.187 に答える