斐波那契递归调用次数_递归算法&递归算法优化

递归

它通常都以一个递归函数体现出来

递归函数的特点:它在自己的内部调用自己(必须,不然体现不出递归的思想)和结束条件(可要可不要,但是如果缺了它,函数将永远执行下去)

我举几个栗子让大家理解


比如说这段代码

def dg(): #定义一个叫dg的递归函数
    print('我真nb')
    dg() #调用自己

如果我们调用dg这个递归函数,因为它没有结束条件,所以理论上它会永远执行下去

没错,它会打出一大堆“我真nb”

然后就要程序帮你结束了(不怀好意的笑容)

RecursionError: maximum recursion depth exceeded while calling a Python object

意思是你用递归太多了,不能再用了(超出递归最大深度)

PS:这种问题似乎只有Python有。。。


在现实使用时,不可能让递归函数永远执行下去
所以,我们需要给函数加上结束条件

比如我们要实现一个求斐波那契数列任意一项的函数fib

斐波那契数列_百度百科​baike.baidu.com
51e29fcf3b6ebb5037de19ca53c3f093.png
def fib(n):
    if (n == 1 or n == 2): #满足递归函数结束条件:参数n为1或为2时
        return 1 #返回1,因为斐波那契数列的前两位都是1
    else: #不满足递归函数结束条件
        return fib(n - 1) + fib(n - 2) #返回自己

如果我们调用fib(6),它的流程图

1b8094f2787612b169267e7ced22f811.png
把流程图从上往下读直到遇到结束条件fib(1)或fib(2)的过程,这是“递归”中的“递”;把流程图从下往上相加从而推出fib(6) = 8的过程,这是“递归”中的“归”

1d77646c7140c3401e9050e0af8efff1.png

没错,递归就是一个把问题拆成更小的问题(不断地返回自己),直到这个最小的问题可以被你解决(达到终止条件),然后一步步的反推回去,得到问题的解。

递归优化

任何一种算法能优化,递归也不例外。

我们再次回到那个fib函数的流程图上

发现了吗?竟然有好多是重复的!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值