算法图解学习笔记(三)——递归

一、递归的引入

小故事:一个盒子里还有盒子,盒子的盒子里面还有盒子,祖母说钥匙就在其中某个盒子中,为找到钥匙,用什么算法

第一种方法:----普通while循环

第二种方法:---递归,函数调用自己

总结:其实递归方案的引用,对程序的性能没什么影响,只是方便理解,所以具体应用中,需要考虑实际场景来使用递归

二、基线条件和递归条件

例如:我们编写一个倒计时的函数

def countdown(i):
    print(i)
    countdown(i-1)
countdown(2)

他会一直运行,因为我们没有告诉它什么时间结束,所以每个递归函数都有两个部分组成:基线条件、递归条件,递归条件是指自己调用自己,基线条件是指函数不再调用自己,从而避免形成无限循环

那么上面的函数添加了基线条件以后是这样的:其中 if 条件就是基线条件,else后面就是递归条件

def countdown(i):
    print(i)
    if i<=1:
        return
    else:
       countdown(i-1)
countdown(10)

三、栈

1、栈是由一系列对象组成的一个集合,这些对象满足后近先出(LIFO)的原则。 和自动贩卖机卖水一样,也就是删除和插入都是最后一个。

2、调用栈:计算机在内部使用被称为调用栈的栈

3、执行递归的过程可以是调用栈的过程:例如递归函数的调用栈,5!=5*4*3*2*1

def fact(x):
    if x==1:
        return 1
    else:
        return  x*fact(x-1)
i=int(fact(5))
print(i)

---执行递归的过程可以是调用栈的过程, 如下图, 调用的函数的执行内存都存放在栈对象中,执行完后被释放。

---使用栈虽然很方便,但是也要付出代价,存储详尽的信息可能占用大量的内存,每个函数调用都要占用一定的内存,如果栈很高,就意味着计算机存储了大量函数调用的信息,所以我们就需要重新编写代码。或者使用循环,或者使用尾递归                                                                                                                                                                                                                                                                                            

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值