斐波拉切数列研究

斐波拉契(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 



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