使用lambda的阶乘函数



我正试图将下面的函数实现为一行lambda代码。

def fac(num):
num = int(num)
if num > 1:
return num * fac(num - 1)
else:
return 1

我已经构造了一个lambda语句,但我一直收到语法错误:

z = lambda z: if (z > 1) z * (z-1) else 1

首先,当存在同名的局部变量(参数(时,不能引用全局名称z

因此,我们将声明一个名为funclambda语句,并以良好的方式使用ternary运算符。

func = lambda z: z * func(z-1) if (z > 1) else 1

输出

> func(5)
120

不要在真正需要def语句的地方使用lambda表达式。Lambda表达式生成匿名函数。匿名函数本身不能有引用,Python中的递归依赖于有这样的引用(通常是全局或非局部变量的形式(。


也就是说,可以(使用一点花哨的lambda演算(从匿名函数创建递归函数。诀窍是,您的匿名函数将接受两个参数:一个是";真实的";参数,另一个是对要调用的函数"的引用;递归地";。

lambda n, f: n*f(n-1) if n else 1

这里没有递归调用;当n大于0时,匿名函数只需将n乘以在n-1上调用的某个函数f的返回值。(我们假设n > 0。(您的函数不知道或不关心f是什么;它只是把它当作一个论据。

给我们递归的是一个单一的";通用的";称为CCD_ 11的递归函数。它接受你的双参数函数,并返回一个单参数函数,该函数调用你的原始函数,其包装器作为第二个参数传递:

def fix(g):
def wrapper(n):
return g(n, wrapper)
return wrapper
fact = fix(lambda n, f: n*f(n-1) if n else 1)

然后

>>> fact(0)
1
>>> fact(3)
6
>>> fact(6)
720

作为lambda的完整解决方案如下:

factorial = lambda n: 1 if n <= 1 else factorial(n - 1) * n

你的代码有三个问题:

a( 您正在调用函数z和参数z。如果您计划递归调用函数本身,则不能这样做,尽管您在代码中没有这样做。

b( 递归函数有一个常规情况和一个基本情况。当参数降到1时,基本情况,即递归的结束,而在常规情况下,您调用n*factorial(n-1(。

c( 您使用三元运算符的顺序不正确,可能是考虑了c和其他语言中的三元运算符,其中有:<conditional-expression> ? <expression1> : <expression2>,而在Python中语法为<expression1> if <conditional-expression> else <expression2>

最新更新