1. 程式人生 > >斐波那契數列的python實現(遞迴與list實現)

斐波那契數列的python實現(遞迴與list實現)

斐波那契數列概念

斐波那契數列(Fibonacci sequence),又稱黃金分割數列、因數學家列昂納多·斐波那契(Leonardoda Fibonacci)以兔子繁殖為例子而引入,故又稱為“兔子數列”,指的是這樣一個數列:1、1、2、3、5、8、13、21、34、……在數學上,斐波納契數列以如下被以遞推的方法定義:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=3,n∈N*)

斐波那契數列的實現

 根據數列的數學規律,使用遞迴的方式進行實現,每一個數的計算都需要回溯到初始位上進行推算。 比如斐波那契數列中【1、1、2、3、5、8、13、21、34】,為了求出第8位21的值,即F(8),就要求出F(7)和F(6)的值,而為了 求出第9位的值F(9),同樣要回退到計算F(8)的值以及F(7)的值,而這些過程不會因為前面計算過而不需要再計算。 因此這將會在n的值越大的情況下,遞迴深度越大,同時也浪費時間在同一個數的計算上,相反如果每一次計算出的值都得到記 錄,那麼就能解決這個問題了,因而引出list的實現。

兩種方式的程式碼實現

# -*- coding: utf-8 -*-
"""
Created on Thu Sep 20 15:44:50 2018

Description:
Version:
    
@author: HJY
"""

import time
start = time.time()

#遞迴實現
#運算時間:35個數5.15秒
def fb_iter(n):
    if n == 1:
        return 0
    if n == 2:
        return 1
    if n >2:
        return fb_iter(n-2)+fb_iter(n-1)
    
#print(fb_iter(35))

#list實現:35個數時間忽略不計
def fb_list(n):
    fb_list = [0 for _ in range(n)]    
    if n == 1:
        pass
    if n == 2:
        fb_list[1] = 1
    else:
        fb_list[1] = 1
        i = 2
        while i < n:
            fb_list[i] = fb_list[i-1] + fb_list[i-2]
            i+=1
            
    return fb_list

print(fb_list(50))
end = time.time()
print(end-start)