递归和栈

本文介绍了递归的概念,包括基线条件和递归条件,并通过倒计时函数示例进行说明。同时,深入解释了栈的工作原理,如压入和弹出操作。接着,通过具体的例子详细阐述了调用栈在函数执行过程中的作用,特别是递归调用时栈的状态变化,帮助读者理解递归调用栈的工作机制。
摘要由CSDN通过智能技术生成

递归

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

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

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

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

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值