斐波那契數列(Fibonacci sequence),又稱黃金分割數列、因數學家列昂納多·斐波那契(Leonardoda Fibonacci)以兔子繁殖為例子而引入,故又稱為“兔子數列”,指的是這樣一個數列:0、1、1、2、3、5、8、13、21、34、……在數學上,斐波那契數列以如下被以遞推的方法定義:F(1)=0,F(2)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 3,n ∈ N*
本文章要解決的問題是:
1、生成前n項斐波那契數列
2、求第n項斐波那契數列的值是多少
3、給定終止值,生成此前斐波那契數列
1、求第n項斐波那契數列的值是多少(普通版)
根據通項公式遞歸求值,此種方法雖代碼簡潔卻效率太低
1 def Fibonacci(n): 2 if n == 1: # 如果n=1,返回0 3 return 0 4 elif n == 2: # 如果n=2,返回1 5 return 1 6 else: 7 return Fibonacci(n-1) + Fibonacci(n-2) # 通項公式 F(N) = F(N-1) + F(N-2)
2、求第n項斐波那契數列的值是多少(快速版)
由於遞歸自頂向下的方式效率太低,我們采用自底向上的方式,先將數值正向放入列表中,最后從列表中取值。
1 def Fibonaccii(n): 2 seq = [0,1] # 初始列表怕[0,1] 3 if n == 1: # 如果n=1,返回[0] 4 return [0] 5 elif n == 2: # 如果n=2,返回[0,1] 6 return [0,1] 7 else: 8 for i in range(n-2): # 循環往列表中添加數列,初始已有兩項故添加項數為n-2 9 seq.append(seq[i]+seq[i+1]) # 添加的數列值等於前兩項的和 10 return seq[-1] # 取最后一項的值
3、給定終止值,生成此前斐波那契數列
隨便給定一個數字,求不大於此數值的斐波那契數列
def Fibonacciii(n): seq = [0,1] # 初始化列表 i = 0 # 初始i if n == 0: # 如果n=0,返回列表[0] return [0] else: if n <= 3: # 如果0<n<3 for i in range(n): # 循環往初始列表中添加斐波那契數列 seq.append(seq[i]+seq[i+1]) return seq else: # 如果n > 3 while True: # 理論上當n 不確定時,需要添加的項數也是不確定的,故死循環 if seq[-1] <= n: # 一直添加,如果添加的最后一項不大於給定值 seq.append(seq[i]+seq[i+1]) i += 1 # 每次循環i 遞增 continue # 繼續循環,不執行以下代碼 break # 當最后一項大於給定值時,跳出死循環 return seq[0:-1] # 最后返回去掉最后一個數值的斐波那契數列
4、求前n項斐波那契數列
1 def Fibonaccii(n): 2 seq = [0,1] # 初始化列表 3 if n == 1: # n=1,返回[0] 4 return [0] 5 elif n == 2: # n=2,返回[0,1] 6 return [0,1] 7 else: 8 for i in range(n-2): # n>2,循環添加數列到初始列表中 9 seq.append(seq[i]+seq[i+1]) 10 return seq
