python 递归学习记录

一直都觉得很难理解递归这种数据结构,用《算法图解》里最简单的例子,权当记录并理解一下。

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”弹出调用栈

不知道理解上有没有微妙的差距,但是至少可以让自己理解这个过程。

猜你喜欢

转载自blog.csdn.net/sisqzy86/article/details/82693733