码迷,mamicode.com
首页 > 其他好文 > 详细

lambda递归调用的一般方法

时间:2020-10-22 22:56:05      阅读:25      评论:0      收藏:0      [点我收藏+]

标签:如何   入口   参与   lang   def   调用   ret   绑定   print   

lambda递归调用的一般方法

普通的递归调用

普通递归调用,例如求阶乘

def fact(n):
    if n == 0:
        return 1
    else:
        return n * fact(n - 1)

被递归函数需要一个固定名称,以期在函数中引用此名称进行递归。那么,如果单纯使用lambda匿名函数,应如何实现递归。

lambda递归

以阶乘为例,用lambda匿名函数递归可写为

print(
(lambda n:  (lambda f: f(f, n))
 (lambda f, v:   1 if v == 0 else v * f(f, v - 1)))
(10)
)

多个函数相互递归

def neg(v, a):
    if a == 1:
        return v + 1
    else:
        v -= (1.0 / a)
        return pos(v, a - 2)

def pos(v, a):
    if a == 1:
        return v + 1
    else:
        v += (1.0 / a)
        return neg(v, a - 2)

def cal_pi(n):
    if n % 2 == 0:
        n += 1
    if (n - 1) % 2 == 0:
        return 4.0 * pos(0, n)
    else:
        return 4.0 * neg(0, n)

这个算圆周率的算法,也可以用lambda递归表示

(lambda n:  (lambda pos, neg:   4.0 * pos(pos, neg, 0, n if n%2 == 1 else n+1))  ((lambda pos, neg, v, k:    v+1 if k == 1 else neg(pos, neg, v + (1.0/k), k-2)),   (lambda pos, neg, v, k:    v+1 if k == 1 else pos(pos, neg, v - (1.0/k), k-2))))(10000)

lambda递归的一般原则

  • 首先声明一个lambda,其参数就是原函数的输入参数
  • lambda内部是另一个lambda的调用,其参数是第三个lambda,第二个lambda的函数体就是递归的入口调用
  • 第三个lambda内才进行真正的递归计算
  • 第三个lambda接收的参数比原函数多一个ft,用来传递lambda自己,
  • 其本质是通过第二个lambda的形参给第三个lambda绑定了一个名字,
  • 然后再把这个名字通过第三个lambda的ft参数传递给自己
  • 如果有多个函数参与递归,那么第一个lambda的参数就是所有需要参与递归的lambda,其函数体就是递归的入口调用

lambda递归调用的一般方法

标签:如何   入口   参与   lang   def   调用   ret   绑定   print   

原文地址:https://www.cnblogs.com/wxxr/p/13858899.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!