嵌套Lambda函数工作逻辑解析:inner参数取值原理问询
这段递归阶乘Lambda代码的工作原理解析
先把代码贴出来:
>>> ( lambda n: (lambda fact: fact(n, fact))( lambda n, inner: 1 if n == 0 else (n * inner(n - 1, inner)) ) )(5) 120
整体逻辑拆解
这是用匿名函数(lambda)实现的阶乘递归,核心解决了匿名函数没有名字、无法直接调用自己的问题,本质是简化版的Y组合子思路。
一步步拆解开看
最外层调用:
(lambda n: ...)(5)
把数字5传给最外层lambda的参数n,直接触发内部逻辑执行。中间的lambda传参调用:
(lambda fact: fact(n, fact))(...)
这里把后面定义阶乘逻辑的lambda,作为参数传给fact,然后立刻调用fact(n, fact)——也就是调用那个阶乘lambda,传入两个参数:- 第一个参数是外层的
n=5 - 第二个参数是
fact本身,也就是这个阶乘lambda函数自己
- 第一个参数是外层的
核心的阶乘lambda:
lambda n, inner: 1 if n == 0 else (n * inner(n - 1, inner))
这部分是阶乘的递归逻辑,重点解释你疑惑的inner参数:inner就是这个lambda函数自己!因为调用fact(n, fact)时,fact就是这个lambda,所以inner接收的就是它自身。- 当n不等于0时,执行
n * inner(n-1, inner)——这里的inner(n-1, inner)就是把当前lambda自己再传进去,实现递归调用。
实际执行流程(以计算5!为例)
- 第一次调用:n=5,inner=阶乘lambda → 计算
5 * inner(4, inner) - 第二次调用:n=4,inner=阶乘lambda → 计算
4 * inner(3, inner) - 第三次调用:n=3 →
3 * inner(2, inner) - 第四次调用:n=2 →
2 * inner(1, inner) - 第五次调用:n=1 →
1 * inner(0, inner) - 第六次调用:n=0 → 返回1
- 反向相乘:11=1 → 21=2 → 32=6 →46=24 →5*24=120,最终得到结果。
为什么要这么写?
普通递归函数可以通过函数名调用自己,但lambda是匿名的,没有名字,所以只能通过把函数自身作为参数传进去的方式,让它能调用自己,实现匿名递归。
内容的提问来源于stack exchange,提问作者vasili111
相关产品推荐
相关产品推荐

