通过递归计算阶乘时,为什么这段代码有效:
def factorial(x):
if x == 1:
return x
return factorial(x - 1) * x
但这并不是:
def factorial(x):
if x == 1:
return x
return factorial(x) * (x - 1)
两者看起来与我非常相似,有人可以解释并通过堆栈跟踪,感谢帮助,谢谢。
答案 0 :(得分:4)
好吧,当我们定义阶乘时我们说n! = n*(n-1)!
,在你的第二个代码上,你写的是n! = (n-1)*n!
答案 1 :(得分:2)
第二个代码是无限递归的。你一遍又一遍地呼叫factorial(x)
。
第一个版本会在每次调用时从1
中减去x
,因此最终x
会触及您的基本情况,即x == 1
。
答案 2 :(得分:2)
很难通过您未能提供的堆栈跟踪。让我们来看看每个函数的扩展为3!
第一个功能:
factorial(3)
factorial(2) * 3
factorial(1) * 2 * 3
1 * 2 * 3
...这导致了预期的答案,6
第二功能:
factorial(3)
factorial(3) * 2
factorial(3) * 2 * 2
factorial(3) * 2 * 2 * 2
factorial(3) * 2 * 2 * 2 * 2
...最终会溢出堆栈(意思是:-),你来到正确的网站寻求答案)。
简而言之,第二个不起作用,因为它代数错误,以及无限递归。正如其他人已经指出的那样,每次都进行相同的调用,无法结束递归。