通过递归的Python阶乘

时间:2016-05-25 21:18:17

标签: python recursion

通过递归计算阶乘时,为什么这段代码有效:

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)

两者看起来与我非常相似,有人可以解释并通过堆栈跟踪,感谢帮助,谢谢。

3 个答案:

答案 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

...最终会溢出堆栈(意思是:-),你来到正确的网站寻求答案)。

简而言之,第二个不起作用,因为它代数错误,以及无限递归。正如其他人已经指出的那样,每次都进行相同的调用,无法结束递归。