当前位置:  开发笔记 > 编程语言 > 正文

lambda函数可以在Python中递归调用自身吗?

如何解决《lambda函数可以在Python中递归调用自身吗?》经验,为你挑选了6个好方法。

常规函数可以在其定义中包含对自身的调用,没问题.我无法弄清楚如何使用lambda函数来做这件事,原因很简单,因为lambda函数没有可以引用的名称.有办法吗?怎么样?



1> Greg Hewgill..:

我能想到的唯一方法就是为函数命名:

fact = lambda x: 1 if x == 0 else x * fact(x-1)

或者,对于早期版本的python:

fact = lambda x: x == 0 and 1 or x * fact(x-1)

更新:使用其他答案中的想法,我能够将阶乘函数楔入一个未命名的lambda:

>>> map(lambda n: (lambda f, *a: f(f, *a))(lambda rec, n: 1 if n == 0 else n*rec(rec, n-1), n), range(10))
[1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880]

所以这是可能的,但不是真的推荐!


`map(lambda n:(lambda f,n:f(f,n))(lambda f,n:n*f(f,n-1)if n> 0 else 1,n),range(10)) `
无用而有趣.这就是我喜欢计算的原因.
FWIW,这里是如何使用相同的技术(给它命名)在Fibonacci系列中生成数字:`fibonacci = lambda n:0如果n == 0否则1如果n == 1否则fibonacci(n-1)+ fibonacci (n-2)`.

2> Hugo Walter..:

没有reduce,map,命名为lambdas或python内部:

(lambda a:lambda v:a(a,v))(lambda s,x:1 if x==0 else x*s(s,x-1))(10)


如果你解释这段代码的工作方式,我将不胜感激:)
由于第一个函数及其返回值是立即调用的,因此它们仅用作赋值.Python化了一下,这段代码说`a = lambda我自己,x:1如果x == 0别x*我自己(我自己,x-1)`那么`v = 10`,最后是'a(a,v)`.复杂的lambda被设计为接受自己作为它的第一个参数(因此我将参数重命名为`self`),它用它来递归地调用自身

3> Nux..:

与某些人说的相反,你可以直接这样做.

(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)

第一部分是定点组合子 Y,它有助于lambda演算中的递归

Y = (lambda f: (lambda x: f(lambda v: x(x)(v)))(lambda x: f(lambda v: x(x)(v))))

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

fact = (lambda f: (lambda i: 1 if (i == 0) else i * f(i - 1)))

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

F = Y(fact)

它应用于第三部分n,它被推广到第n个阶乘

>>> n = 5
>>> F(n)
120

或者等价的

>>> (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

然而,如果你喜欢小谎的事实,你可以做到这一点使用相同的组合子

>>> (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


干得好,你刚刚把Python变成了Lisp :)

4> sth..:

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

# 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))

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



5> habnabit..:

是.我有两种方法可以做到,其中一种已经被覆盖了.这是我的首选方式.

(lambda v: (lambda n: n * __import__('types').FunctionType(
        __import__('inspect').stack()[0][0].f_code, 
        dict(__import__=__import__, dict=dict)
    )(n - 1) if n > 1 else 1)(v))(5)


是的,有史以来最糟糕的Python代码+1.当Perl的人说"如果你知道自己在做什么的话,你可以在Perl中编写可维护的代码",我说"是的,如果你知道你在做什么,你就可以在Python中编写不可维护的代码".:-)
我不懂Python,但看起来很糟糕.真的有一个更好的方法.
+1教我一种滥用Python的新方法.
伙计,您必须学会欣赏混淆的代码。:(

6> Lemmy..:

我从来没有使用Python,但这个可能是你在找什么.

推荐阅读
U友50081205_653
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有