栈
栈: 是只允许在一端进行插入或删除操作的线性表
如果想要充分了解递归的调用过程,我们需要理解什么是栈:
- 栈顶:线性表允许进行插入和删除的那一端
- 栈底:固定的,不允许进行插进和删除的另一端
- 空栈:不含有任何元素的空表
- 栈的几种操作:(初始化栈,判断是否为空栈,进栈,出栈)
递归的实现原理
什么是递归
- 递归边界:递归的出口
- 递归假设:设想如何达到递归边界
- 递归推到:将递归假设实现
这里我将引入代码片段来说明:
def f(x):
if x < 0: #递归边界
return
print(x)
f(x - 1) #调用自己
print(x) #第二次打印
if __name__ == " __mian__ ":
f(3) #从3开始打印
代码执行结果如下:
这里我们回到前面栈的的讲解,用伪代码实现函数递归调用的过程:
0> init_stack = []
1>
2> stack_push(stack, [3, 返回点1])
3> 返回点1:
4>
5> while not statck_empty(init_stack):
6> 程序开头(标记点):
7> x, 返回点 = stack_top(init_stack) #3,_3 #2,_15 #1,_15 #0,_15 #-1,_15
8> if x < 0:
9> stack_pop(init_stack) #3,_3 #2,_15 #1,_15 #0,_15
10> goto 返回点
11>
12> print(x) #3 2 1 0
13> stack_push(init_stack, [x-1, 返回点2]) #2,_15 #1,_15 #0,_15 #0,_15 #-1,_15
14> goto程序开头
15> 返回点2:
16> x, 返回点 = stack_top(init_stack) #0,_15 #1,_15 #2,_15 #3 ,_3
17> print(x)# 0 1 2 3
18> stack_pop(init_stack)#3,_3
19> goto 返回点
这里的结果同上面第一个代码片段的结果是一样的,即:3210 0123
总结
整个过程就是,拿进去再拿出来! 所以理解整个过程,才能完全理解递归的实现,从而不会觉得迷茫!