一直都觉得很难理解递归这种数据结构,用《算法图解》里最简单的例子,权当记录并理解一下。
def fact(x): if x == 1: return 1 else: return x * fact(x-1) fact(3)
1)
当x == 3 时,执行fact(3),
return x * fact(3-1) → return 3 * fact(2)
# 当前函数调用在调用栈(位置:内存块1中存储变量x = 3)的最底层,当前函数执行暂停,并等待fact(2)返回
2)
当x == 2 时,执行fact(2),
return x * fact(2-1) → return 2 * fact(1)
# 当前函数调用在调用栈(位置:内存块2中存储变量x = 2)的倒数第二层,当前函数执行暂停,并等待fact(1)返回
3)
当x == 1 时,执行fact(1),
return 1
# 当前函数调用在调用栈(位置:内存块3中存储变量x = 1)的最顶层(到达基线条件 base case),返回fact(1) = 1
# 内存块3释放,并把当前“调用x=1”弹出调用栈
4)
从 x == 2 返回,接着执行fact(2)
return 2 * fact(2-1) → return 2 * 1 == 2
# 接着执行fact(2)并返回值 2 (2*fact(1)), 内存块2释放,并把当前“调用x=2”弹出调用栈
5)
从 x == 3 返回,接着执行fact(3)
return 3 * fact(3-1) → return 3 * 2 == 6
# 接着执行fact(3)并返回值 6 (3*fact(2)), 内存块1释放,并把当前“调用x=3”弹出调用栈
不知道理解上有没有微妙的差距,但是至少可以让自己理解这个过程。