首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Python中,lambda函数可以递归地调用自己吗?

在Python中,lambda函数可以递归地调用自己吗?
EN

Stack Overflow用户
提问于 2009-01-27 06:42:42
回答 14查看 50.4K关注 0票数 75

一个常规函数可以在其定义中包含对自身的调用,这是没有问题的。我不知道如何使用lambda函数来实现这一点,原因很简单,lambda函数没有可以引用的名称。有办法做到这一点吗?多么?

EN

回答 14

Stack Overflow用户

发布于 2012-01-03 00:34:16

不使用reduce,map,命名为lambdas或python内部:

代码语言:javascript
复制
(lambda a:lambda v:a(a,v))(lambda s,x:1 if x==0 else x*s(s,x-1))(10)
票数 60
EN

Stack Overflow用户

发布于 2012-04-14 00:50:06

与某事物所说的相反,你可以直接做这件事。

代码语言:javascript
复制
(lambda f: (lambda x: f(lambda v: x(x)(v)))(lambda x: f(lambda v: x(x)(v))))(lambda f: (lambda i: 1 if (i == 0) else i * f(i - 1)))(n)

第一部分是fixed-point combinator Y,它简化了λ演算中的递归

代码语言:javascript
复制
Y = (lambda f: (lambda x: f(lambda v: x(x)(v)))(lambda x: f(lambda v: x(x)(v))))

第二部分是递归定义的阶乘函数事实

代码语言:javascript
复制
fact = (lambda f: (lambda i: 1 if (i == 0) else i * f(i - 1)))

将y应用于事实以形成另一个lambda表达式

代码语言:javascript
复制
F = Y(fact)

它应用于第三部分,n,它计算到第n阶乘。

代码语言:javascript
复制
>>> n = 5
>>> F(n)
120

或等同于

代码语言:javascript
复制
>>> (lambda f: (lambda x: f(lambda v: x(x)(v)))(lambda x: f(lambda v: x(x)(v))))(lambda f: (lambda i: 1 if (i == 0) else i * f(i - 1)))(5)
120

但是,如果您更喜欢谎言而不是事实,那么您也可以使用相同的组合子

代码语言:javascript
复制
>>> (lambda f: (lambda x: f(lambda v: x(x)(v)))(lambda x: f(lambda v: x(x)(v))))(lambda f: (lambda i: f(i - 1) + f(i - 2) if i > 1 else 1))(5)
8
票数 32
EN

Stack Overflow用户

发布于 2009-01-26 23:16:30

你不能直接这么做,因为它没有名字。但是使用像Lemmy所指的Y-combinator这样的辅助函数,您可以通过将函数作为参数传递给自身来创建递归(尽管这听起来很奇怪):

代码语言:javascript
复制
# helper function
def recursive(f, *p, **kw):
   return f(f, *p, **kw)

def fib(n):
   # The rec parameter will be the lambda function itself
   return recursive((lambda rec, n: rec(rec, n-1) + rec(rec, n-2) if n>1 else 1), n)

# using map since we already started to do black functional programming magic
print map(fib, range(10))

这将打印前十个斐波纳契数:[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]

票数 23
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/481692

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档