递归和栈

递归

递归是很多算法中都使用的一种编程方法。

递归包含两部分:基线条件和递归条件。基线条件是函数不再调用自己的条件,而递归条件就是继续调用自己递归的条件。

下面举个例子来说明什么是基线条件?什么是递归条件

例:编写一个倒计时函数,从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) 然后依次进行。

这个过程主要是用来理解在函数运行过程中递归调用栈的状态,以及栈的压入和弹出。

    原文作者: 汉诺塔问题
    原文地址: https://blog.csdn.net/weixin_41442912/article/details/80351362
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞