我正试图将下面的函数实现为一行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
。
因此,我们将声明一个名为func
的lambda语句,并以良好的方式使用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>
。