斐波那契数列的思考

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

 

 


前言

提示:这里可以添加本文要记录的大概内容:
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


提示:以下是本篇文章正文内容,下面案例可供参考

一、

1.最简单版本

def fib(n):
    if(n<3)
      return 1
  return fib(n-1)+fib(n-2)

这种代码的写法会导致时间复杂度和空间复杂度都很高,借助递归树不难看出,接近2的n次方指数级别的时间复杂度。理解这个时间复杂度有点类似于二叉树的层数,比如说一个具体的fib(8),层数是7层,当n足够大的时候,其实就无限接近了。而空间复杂度比较难理解,是O(1),这个比较难理解,因为函数调用的本质是堆栈的操作,调用结束空间销毁,所以只会占用有限可数个函数栈空间。

2.稍微改进

代码如下(示例):

def fib(n):
    tmp = np.zeros(n)
    tmp[0] = 1
    tmp[1] = 1
    for i in range(2,n):
        tmp[i] = tmp[i-2]+tmp[i-1]

            return tmp[n-1]

这个代码的改进思路是把所有计算的过程都存储起来,避免重复调用函数,所以时间复杂度低了变成了O(n).但是空间复杂度确实高了,也变成了O(n),是因为之前栈还有销毁空间,而这里就存储在一个数组里面,注意return 的是n-1,因为数组下标从第0项开始的。


3.进一步改进

def fib(n):
    a,b =1,1
    c = 0
    for i in range(2,n):
        c = a+b
        a = b
        b = a
    return c

这个代码就进一步提升了,空间复杂度是O(1),时间复杂度是O(n),改进的思路就是返回的结果只与前面两项有关,其余的数都是多余的,所以我要用两个来代替,为了降低存储空间,所以也会使用两个变量来不停的赋值。

4.还有更好的解决方案

时间复杂度为O(1),其实有一个投机取巧的办法就是公式,但是这个公式是可以用矩阵分解来证明的,hh~

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值