【Day34】[演算法]-费波那契数列Fibonacci Sequence

之前在递回的篇章有介绍过费波那契数列,是使用递回的方式实作,但是从下面递回的树状图来看,会发现有很多重复的节点,递回的深度越深,重复计算的节点也就越多,甚至会出现RecursionError的情况,而这样的时间复杂度为O(2^n)。
https://ithelp.ithome.com.tw/upload/images/20211015/20121027PQhJA2oGXY.jpg
https://ithelp.ithome.com.tw/upload/images/20211015/20121027w33ThcZSUU.png


因此可以将会重复计算的部分暂存起来避免重覆计算来增加处理效能。

def fibonacci(n):
    if n == 0 or n == 1:
        return n
    seq = [0 for _ in range(n + 1)]
    seq[0] = 0
    seq[1] = 1
    for i in range(2, n + 1):
      seq[i] = seq[i-1] + seq[i-2]
    return seq[n]

fibonacci(8)#21
  • 建立一个seq列表
  • seq[i]为F(i)的值,可以说seq[i] = seq[i-1] + seq[i-2]
  • 把seq[0]为0、seq[1]为1
  • 用回圈计算i=2到n+1时,得出seq[i]的结果,储存於seq列表中被使用
  • 最後算出来的seq[n],就是F(n)的值

透过上面的方式,可以发现真正被计算到的只剩下橘色部分蓝色框为已经被储存在seq列表中,不需要重复计算,时间复杂度变为O(n)
https://ithelp.ithome.com.tw/upload/images/20211015/201210270aqGI7Z1HW.jpg


根据上述方式,空间复杂度为O(n),但还可以有更进阶的方式来节省空间

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

fibonacci(8)#21
  • 开始的前两项a与b,为0与1
  • 後一项c是前两项的加总
  • 只需要对a和b不断重新赋值

空间复杂度就能从原本的O(n)变成O(1)。


<<:  Day 30:完赛了,下次一起再来参加铁人赛吧!

>>:  [Day30] 让Web开发者森77之後 / 总结

Day 10 python NumPy

今天我们要介绍的是python的Numpy,所谓的Numpy就是python里面的其中一个套件。 安...

[Day 13] SCSS 结合 Bootstrap 网页制作

前言 非常感谢六角学院在今年疫情最严重的5、6月份,提供了一系列的线上体验学习课程,能够从课程中,再...

Day 11 MSW初体验

Mocks Service Worker 先来介绍一下msw,因为我们要模拟真实的环境不可能随时都使...

Day8 - 2D渲染环境基础篇 IV[像素操作概论] - 成为Canvas Ninja ~ 理解2D渲染的精髓

『像素操作(Pixel Manipulation)』 顾名思义就是要去以单一像素为最小单位来进行操作...

[30天 Vue学好学满 DAY17] Event Bus

Event Bus 前面提到了父子元件透过emit & prop进行参数传递,当树状结构逐渐...