You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

嵌套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组合子思路。

一步步拆解开看

  1. 最外层调用:(lambda n: ...)(5)
    把数字5传给最外层lambda的参数n,直接触发内部逻辑执行。

  2. 中间的lambda传参调用:(lambda fact: fact(n, fact))(...)
    这里把后面定义阶乘逻辑的lambda,作为参数传给fact,然后立刻调用fact(n, fact)——也就是调用那个阶乘lambda,传入两个参数:

    • 第一个参数是外层的n=5
    • 第二个参数是fact本身,也就是这个阶乘lambda函数自己
  3. 核心的阶乘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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 02:24:22