递归
递归是很多算法中都使用的一种编程方法。
递归包含两部分:基线条件和递归条件。基线条件是函数不再调用自己的条件,而递归条件就是继续调用自己递归的条件。
下面举个例子来说明什么是基线条件?什么是递归条件
例:编写一个倒计时函数,从3倒计时到1结束
# 倒计时3 2 1
def dict(i):
print(1)
# 基线条件
if i <= 1:
return
# 递归条件(i>1)
else:
dict(i - 1)
通过上面的例子大家可以很直观的看到和理解什么是基线条件,什么是递归条件。
栈
对于栈,我在各个视频网站之类的地方都看到过,一直觉得是很高深的东西,但是,今天通过学习之后发现,栈这个东西是个非常简单的,我们平时一直在使用而没有意识到(可能是我认识的比较肤浅了,只写自己学习之后的笔记和感受)。
栈有两种操作:压入和弹出。
压入就是程序运行中调用某个函数时,将这个函数插入到这个栈的最上层。
弹出就是程序运行中将调用的这个函数执行完之后,就将这个函数从栈中删除。
调用栈
下面通过一个例子来学习和认识调用栈,具体的过程都将在代码中注释
def greet2(name):
print("how are you,"+name+"?")
def bye():
print("ok bye!")
#第一步调用greet(bob)时,栈上存储变量name为bob,执行greet函数
def greet(name):
print("hello,"+name+"!")
#第二步调用greet2(bob)时,在栈的最上面存储变量name为bob,此时存储的name为greet2函数的,并执行greet2函数
greet2(name)
#第三步,greet2函数执行完,从栈中弹出,并继续执行greet函数
print("getting ready to say bye")
#最后一步调用函数bye,并将bye函数压入栈的最上层
bye()
递归调用栈
下面还是通过一个代码来进行理解
def dict(x):
if x==1:
return 1
else:
return x*dict(x-1)
a=dict(3)
print(a)
对于这个代码:
(1) 首先调用函数dict(3),此时将函数dict以及变量x的值为3,这些压入栈上。并执行dict函数
(2) if判断完之后调用函数dict(2),同样的再将函数dict和变量x的值为2压入栈上。并执行dict函数
(3) 再循环一次步骤2,然后就结束,下面就是执行阶段,
(4) 首先执行最上面一层,就是dict(1),返回值1.
(5) 然后依次进行。
这个过程主要是用来理解在函数运行过程中递归调用栈的状态,以及栈的压入和弹出。