1. 程式人生 > >三種Fibonacci數列第n項計算方法及其優劣分析

三種Fibonacci數列第n項計算方法及其優劣分析

感謝國防科技大學劉萬偉老師和中國傳媒大學胡鳳國兩位老師提供的思路,文章作者不能超過8個字元,我的名字就寫個姓吧,名字不寫了^_^。另外,除了本文討論的三種方法,之前的文章中還討論了另外幾種方法,詳見相關閱讀第一篇。

def fibo4(n):

    '''遞推法

    適用於任意大小的n

    使用生成器函式

    速度快,無誤差'''

    def nested():

        a, b = 1, 1

        while True:

            yield a

            a, b = b, a+b

    # 建立生成器物件

    temp = nested()

    # 獲取前n-1項

    for i in range(n-1):

        next(temp)

    # 返回第n項

    return next(temp)

def fibo5(n):

    '''通項公式法,速度也不錯

    涉及實數運算,會有誤差,

    n越大,誤差越大,

    n大到一定程度會崩潰'''

    z = 5**0.5

    u = (1+z) / 2

    v = (1-z) / 2

    return int((u**n - v**n)/(u-v))

from sympy import sqrt, Symbol, simplify

def fibo6(n):

    '''通項公式法,速度快

       通過符號計算庫的簡化策略,

       彌補了實數運算引入的誤差'''

    c1 = ((1+sqrt(5))/2)

    c2 = ((1-sqrt(5))/2)

    c3 = sqrt(5)

    k  = Symbol("k")

    f = (c1**k-c2**k)/c3

    return simplify(f.subs(k, n))

n = 50

print(fibo4(n))

print(fibo5(n))

print(fibo6(n))

n=50時,執行結果為:

12586269025

12586269025

12586269025

n=80時,執行結果如下,注意開始fibo5有誤差了:

23416728348467685

23416728348467744

23416728348467685

n=200時,執行結果如下,誤差越來越大了:

280571172992510140037611932413038677189525

280571172992512015699912586503521287798784

280571172992510140037611932413038677189525

當n=8000時,fibo4和fibo6仍然正常工作,而fibo5在n=1500左右時就已經無法工作了,程式碼崩潰。

Traceback (most recent call last):

  File "C:/Python36/fibonacci.py", line 43, in <module>

    print(fibo5(n))

  File "C:/Python36/fibonacci.py", line 27, in fibo5

    return int((u**n - v**n)/(u-v))

OverflowError: (34, 'Result too large')

----------相關閱讀---------

----------喜大普奔----------

1、繼《Python程式設計基礎》(2017年9月第5次印刷)、《Python程式設計(第2版)》(2017年9月第4次印刷)、《Python可以這樣學》(2017年7月第3次印刷)系列圖書之後,董付國老師新書《Python程式設計開發寶典》已於2017年8月1日在清華大學出版社出版,並於2017年9月進行了第2次印刷。為慶祝新書《Python程式設計開發寶典》全面上架,清華大學出版社聯合“贛江圖書專營”淘寶店推出特價優惠活動,《Python程式設計開發寶典》原價69元,新書上架期間超低價39.8元,可以複製下面的連結使用瀏覽器開啟檢視圖書詳情和購買:

https://detail.tmall.com/item.htm?spm=a1z10.3-b-s.w4011-14464369246.84.46f16db0roWfX4&id=557107249812&rn=339cbc9df2bac424664103917dedfbd2&abbucket=8&tbpm=3