【发布时间】:2018-11-26 17:56:45
【问题描述】:
我在一定程度上理解递归的概念,但我无法理解递归调用中发生的所有步骤。
例如:
def fact(n):
if n == 0:
return 1
else:
print('{} is not 0, so fact({}) = {} * fact({})'.format(n,n,n,n-1))
return n * fact(n-1)
answer = int (input('Enter some number: '))
print(fact(answer))
>> Enter some number: 5
5 is not 0, so fact(5) = 5 * fact(4)
4 is not 0, so fact(4) = 4 * fact(3)
3 is not 0, so fact(3) = 3 * fact(2)
2 is not 0, so fact(2) = 2 * fact(1)
1 is not 0, so fact(1) = 1 * fact(0)
120
虽然我知道它会重复任务直到它到达 n == 0 的基础,但是 Python 如何存储以前的 5 * 4 * 3 ... 并在到达基础时进行计算,我发现将整个过程可视化有点困难.
另一个例子是当我传递一个可迭代对象时。
def getSum(piece):
if len(piece) == 0:
return 0
else:
print(piece)
return piece[0] + getSum(piece[1:])
print(getSum([1, 3, 4, 2, 5]))
>>
[1, 3, 4, 2, 5]
[3, 4, 2, 5]
[4, 2, 5]
[2, 5]
[5]
15
列表似乎从每次递归减少到piece[n-1:],最终所有返回的值都被求和了。有什么地方可以参考 Python 如何显式管理递归?
【问题讨论】:
-
在任何其他函数调用中也没有发生任何事情。
-
Python 递归与任何其他语言的递归没有什么不同。
-
Python 不求和。你告诉 Python 将
n与函数的返回值相乘:n * fact(n - 1)。它执行了函数调用,然后执行了n * <result>部分。 -
如果您发现它令人困惑,请尝试在纸上手动“运行”算法,只需少量输入。例如,对于
fact(3),当您到达递归调用3 * fact(3-1)时,将fact(3-1)替换为x,并以相同的方式开始计算x(fact(2))。您会发现x是2,因此返回值是3 * 2,即6。 Python 没有做任何没有明确写在函数中的特殊操作。 -
马丁·彼得斯。抱歉,我的意思不是
sum,但我真的想将整个过程可视化,就像return n * fact(n-1)没有在每个递归级别分配给某个标识符,它弄乱了我试图查看它的方式。