如何匿名实现递归阶乘函数?仅用指定表达式与函数
匿名递归实现阶乘(符合CS61A作业限制)
题目要求
编写递归函数时,我们通常用def或赋值语句给函数命名,以便在函数体内引用自身。本题要求你无需命名,递归定义该函数!
编写表达式完成make_anonymous_factorial()函数,仅使用调用表达式、条件表达式和lambda表达式(禁止使用赋值或def语句)计算n的阶乘。特别注意返回表达式中不得使用make_anonymous_factorial,仅允许使用operator模块的sub和mul函数。
示例:make_anonymous_factorial()(5)
120
你之前用reduce的解法不符合题目对工具的限制,以下是完全合规的实现:
合规代码
from operator import sub, mul def make_anonymous_factorial(): return (lambda f: lambda n: f(f, n))( lambda self, n: mul(n, self(self, sub(n, 1))) if n > 1 else 1 )
实现思路
要实现匿名递归,关键是让函数能“拿到自己”——既然不能用函数名,那就把函数自身作为参数传递:
- 外层的
lambda f: lambda n: f(f, n)是个包装逻辑,它接收递归核心函数,返回一个能接收阶乘参数n的函数,同时把递归函数自己传给它; - 内层的
lambda self, n: ...是阶乘的核心逻辑:- 当n大于1时,用
mul计算n乘以n-1的阶乘,通过self(self, sub(n, 1))完成递归调用; - 当n≤1时,返回阶乘的基准值1;
- 当n大于1时,用
- 全程没有使用赋值语句、def定义额外函数,也只用到了题目允许的
sub和mul,完全符合要求。
内容的提问来源于stack exchange,提问作者Deler
相关产品推荐
相关产品推荐

