递归
递归是很多算法中都使用的一种编程方法。
递归包含两部分:基线条件和递归条件。基线条件是函数不再调用自己的条件,而递归条件就是继续调用自己递归的条件。
下面举个例子来说明什么是基线条件?什么是递归条件
例:编写一个倒计时函数,从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) 然后依次进行。
这个过程主要是用来理解在函数运行过程中递归调用栈的状态,以及栈的压入和弹出。