【发布时间】:2015-10-13 13:57:48
【问题描述】:
我正在从《ThinkPython》这本书中学习 python。
在第 56 页(第 6 章。富有成效的函数)中,有一个递归函数可以计算任意数的阶乘。它确实有效,但我不明白为什么。这是代码:
def factorial(n):
if n == 0:
return 1
else:
recurse = factorial(n-1)
result = n * recurse
return result
假设我尝试使用 3,我想这应该会发生:
- 进入阶乘函数,n=3
- 进入else语句,因为n不为0
- 这里回到第 1 步的开头,n = 2
所以它应该在n = 0 之前执行相同的操作并返回1(它永远不会到达最后一行)。
【问题讨论】:
-
“回到开头”可能是你误解的根源。一个函数的多个实例可以同时存在于调用堆栈中,并且每个实例都会记住它的位置。当第二个阶乘调用完成时,它返回到第一个阶乘调用,它仍在
else块中。它不像while或for循环,它返回到顶行。 -
函数遵循阶乘(n)的定义:
the number n multiplied by the factorial(n-1)。测试在那里将其停止在零(递归的基础)。有很多关于recursion 的阅读资料 -
是的,我相信 OP 不清楚的是
recurse = factorial(n-1)不仅仅是函数的go back to the beginning,而是再次调用函数 -
IME,人们仅仅通过阅读解释是无法理解递归的。您必须假装自己是口译员,然后自己完成这些步骤,看看发生了什么。 FWIW,当我学习这些东西时,我发现在大纸上制作图表很有帮助。
标签: python python-2.7 recursion recursive-datastructures