mhsy2003 发表于 2009-04-16 02:17

python下lambda+尾递归

这个真好玩,跟scheme一样。
http://fmn029.xnimg.cn/fmn029/20090416/0215/b_7004f206096.jpg

mhsy2003 发表于 2009-04-16 09:03

回复 #1 mhsy2003 的帖子

>>> print ((lambda self,n:1 if n==1 else n*self(self,n-1))((lambda self,n:1 if n==1 else n*self(self,n-1)),2))
2
>>> print ((lambda self,count,n,value:value if count==n else self(self,count+1,n,(count+1)*value))((lambda self,count,n,value:value if count==n else self(self,count+1,n,(count+1)*value)),1,5,1))
120

izhier 发表于 2009-04-16 09:08

self 竟然可以用到这里,第一次见到

楼主好想法!!!

:em21:

yjphhw 发表于 2009-04-16 09:15

麻烦。。认真解释下。。。

mhsy2003 发表于 2009-04-16 09:42

恩,就是MIT那个著名的丘奇的Y-Combinate,昨天把<<简明python教程>>看完,看到lambda就试着把它写了出来。
关于它的原理看刘未鹏的一篇写的很好的blog:

http://blog.csdn.net/pongba/archive/2006/10/15/1336028.aspx

我怕自己解释不如他那边写的清楚和有味道。

yjphhw 发表于 2009-04-16 09:58

回复 #5 mhsy2003 的帖子

好艰深,,,一看头就大了。。。
唉,,数学没学好啊。。

mhsy2003 发表于 2009-04-16 10:06

回复 #6 yjphhw 的帖子

阶乘尾递归的实现:
版本1:
def factor(count,n,value):
    if count==n:
      return value
    else:
      count+=1
      value = value*count
      return factor(count,n,value)
def fact(n):
    return factor(1,n,1)

print (fact(5))


版本2:
def fact(n):
    factor =lambda count,n,value:value if count==n else factor(count+1,n,(count+1)*value)
    return factor(1,n,1)
   
print (fact(5))


版本3:
print ((lambda self,count,n,value:value if count==n else self(self,count+1,n,(count+1)*value))((lambda self,count,n,value:value if count==n else self(self,count+1,n,(count+1)*value)),1,5,1))


希望有助于你对照理解

efhilt 发表于 2009-04-16 10:11

其实一点都不难理解。这种写法纯属没事找事。

A = lambda A, n : 1 if n == 1 else n * A(A, n -1)

然后直接print A(A, 2)

mhsy2003 发表于 2009-04-16 10:12

回复 #8 efhilt 的帖子

对。:mrgreen:

yjphhw 发表于 2009-04-16 11:17

回复 #8 efhilt 的帖子

这个,好。。
页: [1] 2 3
查看完整版本: python下lambda+尾递归