斐波拉切數列研究

斐波拉契(Fibonacci)數列來源於兔子問題,它有一個遞推關係,
  f(1)=1 
  f(2)=1 
  f(n)=f(n-1)+f(n-2),其中n>=2 
  {f(n)}即爲斐波拉契數列。
  ■斐波拉契數列的公式
  它的通項公式爲:{[(1+√5)/2]^n - [(1-√5)/2]^n }/√5 (注:√5表示根號5) 
  ■斐波拉契數列的某些性質
  ■1),f(n)f(n)-f(n+1)f(n-1)=(-1)^n;
  ■2), f(1)+f(2)+f(3)+……+f(n)=f(n+2)-1 

  ■3),arctan[1/f(2n+1)]=arctan[1/f(2n+2)]+arctan[1/f(2n+3)]

斐波拉契數列與黃金分割有什麼關係呢?經研究發現,相鄰兩個斐波拉契數的比值是隨序號的增加而逐漸趨於黃金分割比的。即f(n-1)/f(n)-→0.618…。由於斐波拉契數都是整數,兩個整數相除之商是有理數,所以只是逐漸逼近黃金分割比這個無理數。但是當我們繼續計算出後面更大的斐波拉契數時,就會發現相鄰兩數之比確實是非常接近黃金分割比的。

  不僅這個由1,1,2,3,5....開始的"斐波拉契數"是這樣,隨便選兩個整數,然後按照斐波拉契數的規律排下去,兩數間比也是會逐漸逼近黃金比的.

斐波那契數列:1,1,2,3,5,8,13,21…… 

  如果設F(n)爲該數列的第n項(n∈N+)。那麼這句話可以寫成如下形式:
  F(1)=F(2)=1,F(n)=F(n-1)+F(n-2) (n≥3)
  顯然這是一個線性遞推數列。
  通項公式的推導方法一:利用特徵方程
  線性遞推數列的特徵方程爲:
  X^2=X+1
  解得
  X1=(1+√5)/2, X2=(1-√5)/2.
  則F(n)=C1*X1^n + C2*X2^n
  ∵F(1)=F(2)=1
  ∴C1*X1 + C2*X2
  C1*X1^2 + C2*X2^2
  解得C1=1/√5,C2=-1/√5
  ∴F(n)=(1/√5)*{[(1+√5)/2]^n - [(1-√5)/2]^n} (√5表示5的算術平方根)
  通項公式的推導方法二:普通方法
  設常數r,s
  使得F(n)-r*F(n-1)=s*[F(n-1)-r*F(n-2)]
  則r+s=1, -rs=1
  n≥3時,有
  F(n)-r*F(n-1)=s*[F(n-1)-r*F(n-2)]
  F(n-1)-r*F(n-2)=s*[F(n-2)-r*F(n-3)]
  F(n-2)-r*F(n-3)=s*[F(n-3)-r*F(n-4)]
  ……
  F(3)-r*F(2)=s*[F(2)-r*F(1)]
  將以上n-2個式子相乘,得:
  F(n)-r*F(n-1)=[s^(n-2)]*[F(2)-r*F(1)]
  ∵s=1-r,F(1)=F(2)=1
  上式可化簡得:
  F(n)=s^(n-1)+r*F(n-1) 
  那麼:
  F(n)=s^(n-1)+r*F(n-1)
  = s^(n-1) + r*s^(n-2) + r^2*F(n-2)
  = s^(n-1) + r*s^(n-2) + r^2*s^(n-3) + r^3*F(n-3)
  ……
  = s^(n-1) + r*s^(n-2) + r^2*s^(n-3) +……+ r^(n-2)*s + r^(n-1)*F(1)
  = s^(n-1) + r*s^(n-2) + r^2*s^(n-3) +……+ r^(n-2)*s + r^(n-1)
  (這是一個以s^(n-1)爲首項、以r^(n-1)爲末項、r/s爲公比的等比數列的各項和)
  =[s^(n-1)-r^(n-1)*r/s]/(1-r/s)
  =(s^n - r^n)/(s-r)
  r+s=1, -rs=1的一解爲 s=(1+√5)/2, r=(1-√5)/2
  則F(n)=(1/√5)*{[(1+√5)/2]^n - [(1-√5)/2]^n}

斐波拉切遞歸式:

cache = {0:1, 1:1}    
    
def feblati(x):    
    assert(x>0)    
    r = 0    
    if x in cache.keys():    
        return cache[x]    
    else:    
        r = feblati(x-1) + feblati(x-2)    
        cache[x] = r    
    return r    

斐波拉切2變量迭代式:

def feblati(x):
    assert(x>0)
    l_1 = 1 
    l_2 = 1 
    for i in xrange(0,x):
        if i > 1:
            t = l_2 
            l_2 = l_1+l_2
            l_1 = t 
    if x in [0, 1]: 
        print 1
    return l_2 + l_1 



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章