[劍指offer] 7. 斐波那契數列 (遞歸 時間復雜度)


簡介:

楊輝三角每條斜線上的數之和就構成斐波那契數列。

思路:

參考文章:https://mp.weixin.qq.com/s?src=11&timestamp=1551321876&ver=1455&signature=ahEqF*AhQMM5L8e-JCqIGUm6vZ8dQHWSX70P-j-tWtN2gQYpHJSB61cItv2h5Sy-DE0E5grEEVTQikdpIT9tC34u5qLh-mvM*PhBuE3S6nU32*9k1NmkS3krk0YVxRpM&new=1

1.遞歸法

class Solution:
    def Fibonacci(self, n):
        # write code here
        if n <= 1:
            return n
        while n >= 2:
            return self.Fibonacci(n-1)+self.Fibonacci(n-2)

f(a)會重復計算,這就是遞歸的最大問題,對於同一個f(a),不能復用。這樣直接求解,時間復雜度是指數級的,不可行;

 

2.正推法

上述方法是采用反向推導,假設要求f(5), 則f(5)=f(4)+f(3); 而f(4)=f(3)+f(2),f(3)=f(2)+f(1);.......一路遞歸下去,最終都將遞歸到f(0)和f(1)上來。反過來想,我們不倒着f(n),f(n-1),f(n-2)這么計算,而是f(0),f(1),f(2)…f(n)這么正向計算,豈不是更快么?這么正向的計算,只需要一個for循環,就能夠計算出f(n)的值,時間復雜度是O(n)

# -*- coding:utf-8 -*-
class Solution:
    def __init__(self):
        self.array=[0]*40  #數組定義,初始化
    def Fibonacci(self, n):
        # write code here
        self.array[0]=0
        self.array[1]=1
        for i in range(2,n+1):  #直接遍歷所有
            self.array[i]=self.array[i-1]+self.array[i-2]
        return self.array[n]

關於數組定義:

  • 一維數組:a1 = [0]*10; a2 = range(10);a3 = [0 for x in range(0, 10)]
  • 二維數組:a = [ [ random.random() for x in range(10) ]  for y in range(5)]  #5行10列];  b=[ [ 0 ]*10 ] * 5

在一維數組中,上述幾種方式沒有區別。

但是在二維數組中,a[0][0]=1時,只有a[0][0]為1,其他全為0。b[0][0]=1時,b[0][0],b[1][0]...直到b[4,0]全部為1。由此得到二維數組中,若采用b這種定義,每一列數據將全是一個相同的引用,即指向同一地址。故 b = [[0]*10]*5並不符合我們常規意義上的二維數組。

 

此外還要多種求解方式,復雜度從指數級到O(n) 到 O(lgn) 到 O(1)均有,具體可讀參考文章

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM