Python 基于lambda的阶乘函数

Python 基于lambda的阶乘函数,python,lambda,Python,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 因此,我们将声明

我试图在一行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语句,并以良好的方式使用
三元
运算符

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

> func(5)
120

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


也就是说,您可以(使用一些奇特的lambda演算)从匿名函数创建递归函数。诀窍在于匿名函数将接受两个参数:一个是“实”参数,另一个是对要“递归”调用的函数的引用

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

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

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)
然后


完整的解决方案如下:

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

factorial=lambda n:1如果n不使用这样的lambda表达式。在Python中不能编写匿名递归函数(至少,如果不先编写第二个函数来计算固定点的话),如果要将lambda表达式的结果赋给一个名称,改为使用
def
语句。考虑到函数可以在一行中重写为:
def fac(num):如果num>1,则返回num*fac(num-1),否则使用lambda表达式1
。最好这样说:“始终使用def语句,而不是将lambda表达式直接绑定到标识符的赋值语句”,这样我就可以像常规语句一样调用lambda函数本身了functions@Yoko,是的,像
func(5)
>>> fact(0)
1
>>> fact(3)
6
>>> fact(6)
720
factorial = lambda n: 1 if n <= 1 else factorial(n - 1) * n