python的递归函数理解

#学习时所学知识,拿来分享

今天我们来说说:递归函数

还有一个非常重要的东西----“递归三要素”

1.基本结束条件

2.函数的规模要不断向最小规模趋近

3.调用函数本身

这个三原则刚刚接触,看起来有点抽象,不过没问题,我会一步一步的用大白话,解读出来

那么何为递归函数

递归函数:
一个函数在其函数体内调用函数自身,这样的函数就称为递归函数。递归函数的原理是使用一个函数通过不断调用函数自身来实现循环处理数据,每一步的计算结果向上一级逐级返回

还是非常难懂,那么我举个例子吧

我们来看这个函数

main(main(main()))

可以发现它时不断不断地重复使用自己来执行命令。

但是这对我们来说十分抽象,什么是重复使用自己?

我举一个例子:《盗梦空间》

这个递归函数与《盗梦空间》有什么关联呢?其中“盗梦空间”指向了递归

我们来看一副图

递归就像我们进入了一层又一层的梦中,然后到达梦的最深层后,不断从最深层处退出一层层的梦镜,最后梦醒了。递归也是如此。

其实递归也是差不多这个是这个原理

给出一副图,

递归里面就是这个效果,接下来我举出一个例子帮助你们更好地去理解递归吧

#在这里,我用一个最简单的阶乘来进行解释

def jiecheng(n):
    if n <= 1:
        return n
#这一步是规定了基本结束情况
    else:
        return n*jiecheng(n-1)

#这里是不断使函数不断向基本结束情况靠近

我们来一步一步地解读它。

首先,我们先看到这个

def jiecheng(n):
    if n <= 1:
        return n

这一步,我们说它是基本结束情况。为何?

让我们回想一下高中数学,4!= 4*3*2*1  这个就是阶乘吧,对吧。在这里我们其实就是让这个递归函数直到n = 1的时候就停止它的递归行为了

不然这个函数是会不停地递归下去,出现bug,这里的bug就是计算机的内存占用不断增加,到后面便崩溃了。

这里,为何会出现这个内存占用呢?

其实,这个递归和我们的那个数据结构---栈很相似(先进后出)这个在上面的原理图其实也可以看出来。

在这里我给大家介绍一个知识点----栈帧

这个栈帧是用来暂时储存现场数据的

(当一个函数被调用的时候,系统会调用现场数据到系统调用栈)

等到递归调用结束后,这一个个现场数据便会由先进后出的顺序,一个个的返回到原先上一级的调用中去。

那么我用第二段然你们更好地去理解:

    if n <= 1:
        return n
    else:
        return n*jiecheng(n-1)


jiecheng(3)

"""
在这里,我以n=3举一个例子
在第一步操作时,这里的else---->指的是: n > 1时的情况
这里便是:   3*jiecheng(2) 对吧但是我们还是不知道具体的值,则进行调用,将jiecheng(2)进行解释
下一步: 这时2被调用进函数中----->  2 * jiecheng(1)   与上一步骤相同

在这里 n = 1 不在满足n > 1 便结束这里的递归 终于到达了基本结束条件
递归便结束了
随后我们的值其实是这样的: 3*jiecheng(2)*jiecheng(1)

从基本结束条件那里,一步步地返回给上一级的调用之中
就变成了--------  3 * 2 * 1  最后进行运算操作 返回最终值







"""

递归就是向下一直循环直到找到最后一个解触发停止,这时候所有中间解都在栈里,此时只是都找出来了没有计算结果,然后把栈里的结果再按从最后一个解往前套入开始套娃直到算到最开始那个,计算结束。整个过程是个V字形一样。因为中间所有计算结果都要先存在栈里所以如果你这个递归方程中间解非常多就会非常占用内存。

那么我们再来一题帮助理解

1.计算一列数之和:

def sumnum(numlist):
    if len(numlist) == 1:
        return numlist[0]  
#这个是该递归函数的基本条件
    else:
        return numlist[0] + sumnum(numlist[1:])
#这里我们是想让这个numlist 不断向着列表中只有一个元素进行靠近
#numlist[1:]---是想让这个列表不断分割为两个,第一个是只有一个,第二个是只有剩余的数

"""
这样不断递归下去最终它会到达我们想要的结果
举个例子  numlist = [1,2,3]
第一轮:
       3 <---numlist[0] + sumnum(numlist[1:])-->就等于 [2:3]被调用进sumnum中
第二轮:
       2<---numlist[0] + sumnum(numlist[1:])----> 就等于[3]被调用进sumnum中去
结束:
        因为[3]---只有一个元素 满足基本结束条件,结束递归了,该返回去了

返回去:
     3 + 2 + 1 

最后执行完第一次递归时的命令 return ----> 返回最终值 6




"""

这就是递归函数的理解

希望对你有所帮助,如果有任何疑问,请在评论区写下你的疑问

  • 13
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值