簡介:
楊輝三角每條斜線上的數之和就構成斐波那契數列。
思路:
參考文章:https://mp.weixin.qq.com/s?src=11×tamp=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)均有,具體可讀參考文章。