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

一、递归的引入

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

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

算法图解学习笔记(三)——递归_第1张图片

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

算法图解学习笔记(三)——递归_第2张图片

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

二、基线条件和递归条件

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

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)

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

算法图解学习笔记(三)——递归_第3张图片

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

你可能感兴趣的:(算法图解学习笔记,算法,python)