我正在尝试编写一个调用自身的lambda表达式,但我似乎找不到任何语法来实现这一点,或者即使它是可能的。
实际上,我想将以下函数转换为下面的lambda表达式:(我意识到这是一个愚蠢的应用程序,它只是添加了一些内容,但我正在探索如何在python中使用lambda表达式)
def add(a, b):
if a <= 0:
return b
else:
return 1 + add(a - 1, b)
add = lambda a, b: [1 + add(a-1, b), b][a <= 0]
但是调用add的lambda形式会导致运行时错误,因为达到了最大递归深度。有没有可能在python中做到这一点?或者我只是犯了个愚蠢的错误?哦,我用的是python3.0,但我不认为这有什么关系?
发布于 2009-07-29 22:41:29
也许你应该试试Z combinator,这个例子就来自这里:
>>> Z = lambda f: (lambda x: f(lambda *args: x(x)(*args)))(lambda x: f(lambda *args: x(x)(*args)))
>>> fact = lambda f: lambda x: 1 if x == 0 else x * f(x-1)
>>> Z(fact)(5)
120
发布于 2009-07-29 22:06:30
首先,递归的lambda表达式是完全不必要的。正如您自己指出的,为了让lambda表达式调用自身,它需要有一个名称。但是lambda表达式只不过是匿名函数。所以如果你给lambda表达式一个名字,它不再是一个lambda表达式,而是一个函数。
因此,使用lambda表达式是没有用的,只会让人感到困惑。所以用def来创建它。
但是,正如您自己发现的那样,lambda表达式可以是递归的。你自己的例子就是。事实上,它是如此奇妙的递归,以至于你超过了最大递归深度。所以它是递归的。您的问题是,您总是在表达式中调用add,因此递归永远不会停止。别干那事。你的表达式可以这样表达:
add = lambda a, b: a > 0 and (1 + add(a-1, b)) or b
它解决了这个问题。然而,你的第一个def是正确的方式。
发布于 2009-07-29 22:13:33
add = lambda a, b: b if a <= 0 else 1 + add(a - 1, b)
https://stackoverflow.com/questions/1203292
复制相似问题