考虑以下两个递归函数来计算输入的阶乘,我天真地认为它们是相同的:
fact = lambda x: 1 if x == 0 else x * fact(x-1)
fact = lambda x: [x*fact(x-1),1][x==0]
第一个运行正常,但第二个运行错误RuntimeError: maximum recursion depth exceeded
。这适用于x==0
和x!=0
。
为什么lambda函数不能处理第二种情况?
答案 0 :(得分:2)
他们不一样。在第二个变量中,将评估列表中的两个表达式,然后才从中选择适当的表达式。但即使x == 0
,这也不能阻止递归的发生。因此,递归继续进入负数,进入内存限制。
... if ... else ...
将首先评估if
关键字后的条件,仅评估与该结果对应的表达式。