在Python中递归定义函数

3

我有一个关于lambda函数的简单问题。我想要做一个循环,在每次迭代中都基于前一个迭代中的lambda函数定义一个新的lambda函数。

f = lambda x: x**2
j=0
J=2
while j<J:
    f2 = lambda x: 0.5*f(x)
    f = f2
    j+=1

我希望f(3)的结果是2.25,即0.5*0.5*3**2。然而,我收到了以下错误信息:

RecursionError: maximum recursion depth exceeded

我认为Lambda函数可以像这样灵活使用。我想知道是否有一种已知的Pythonic方式来正确地做到这一点?
2个回答

4

你 lambda 函数中的名称 f 是在调用 lambda 函数时查找的,此时它引用 lambda 函数本身,因此导致无限递归。

捕获特定时间点的值的常见习惯用法是将其作为 lambda 函数的默认参数,在定义时进行评估:

    f2 = lambda x, f=f: 0.5*f(x)

是否也有使用 def 而不是 lambda 来实现这个的方法? - splinter
当然,对于普通函数来说,默认参数的相同技巧同样适用。请记住,lambda表达式并没有为Python添加任何实际的新功能,它们只是定义非常简单的函数的快捷方式。 - jasonharper

3

当创建一个lambda函数时,它会保留对局部环境的引用,以便在调用lambda时查找变量。您需要将第一个lambda函数作为参数传递给第二个函数:

f = lambda x: x**2
j=0
J=2
while j<J:
    f2 = lambda x, f=f: 0.5*f(x)
    f = f2
    j+=1

请注意,这在Python文档FAQ中有所涉及。

因为答案完全相同,我接受了第一个答案。谢谢。 - splinter
是否也有使用 def 而不是 lambda 来实现这个的方法? - splinter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接