我是python的新手。你能解释一下这段代码吗?
def factorial(n):
if n == 0:
return 1
return n*factorial(n-1)
>>>print factorial(5)
>>>120
谢谢!
答案 0 :(得分:4)
def factorial(n): # define a function, receiving a value 'n'
if n == 0: # if n is 0, then...
return 1 # return the result 1 to the calling code (done!)
return n*factorial(n-1) # otherwise return n times the result of calling
# this function (factorial) with the lower value
>>>print factorial(5)
# factorial(5): 5 != 0, so return 5 * factorial(4)
# factorial(4): 4 != 0 ...
# ...
# factorial(0) = 1 returns to factorial(1) call:
# factorial(1) = 1 * 1 = 1, returns to factorial(2) call:
# factorial(2) = 2 * 1 = 2
# factorial(3) = 3 * 2 = 6
# factorial(4) = 4 * 6 = 24
# factorial(5) = 5 * 24 = 120, return this
>>>120
这称为递归,您可以在其中找到优秀的在线解释。请记住,这是一个要遵循的过程,因此当您看到factorial(n-1)表达式时,python正在计算n-1,然后使用此值开始对factorial
的新调用。结果是每次调用都会再次调用factorial
,直到它最终达到0并且它可以开始返回堆栈到最外层的调用。想象一下,试着自己解决这个问题,你会发现你做的是同样的事情:
(5 * (4 * (3 * (2 * (1 * 1)))))
在知道其中的括号值等之前,您无法完成最外面的括号。
请注意,代码有一个主要缺陷:如果n-1-1-1-1-1等永远不会达到0(例如,如果n = 1.1),那么它将永远不会达到{{1线,永远不会到达兔子洞的底部。事实上,它可能会导致堆栈溢出错误,因为每次调用占用堆栈上的更多空间并最终耗尽。
为了进一步研究,了解尾调用递归(这是一个例子)以及当递归调用在return语句(尾部)时编译器如何解决堆栈溢出问题。