斐波那契(fibonacci)数列与黄金分割比以及矩阵形式推导

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_36369267/article/details/83033904

原文地址:https://blog.csdn.net/lanchunhui/article/details/50569311 (如有侵权请联系删除)

数学上,斐波那契数列以递归的形式进行定义: 

                                                         

注意,递归的形式实现较为简单明了,当然在编程实践时,并不推荐递归的实现方式,因为存在大量的重复计算,斐波那契的优化实现不是本文的重点,如有兴趣,请参阅 每周一刷——从斐波那契数列到动态规划,本文重点探讨菲波那切数列与黄金分割比的关系。

维基百科中说菲波那切数列又叫黄金分割数列,这无疑是在告诉我们我们可以通过黄金分割的方式((√5−1)/2)生成出来一个菲波那切数列。

下面我们简单验证我们的判断:

def fib(n):
    return n if n <= 1 else fib(n-1)+fib(n-2) 
N = 20
print([fib(n) for n in range(N)])

[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181]

int(55*(1+.618)+.5) == 89
int(2584*(1+.618)+.5) == 4181

indeed,诚哉斯言。

我们接着做如下的仿真:

def gold_fib(n):
    return n if n <=2 else int(gold_fib(n-1)*(1+.618))
print([gold_fib(n) for n in range(N)])

[0, 1, 2, 3, 4, 6, 9, 14, 22, 35, 56, 90, 145, 234, 378, 611, 988, 1598, 2585, 4182]
                                # 已经非常接近了,

通过初等代数方法,我们也可得出此解析解的形式,具体请参考 斐波那契数列

def matrix_fib(n):
    return int(1/sqrt(5)*(((1+sqrt(5))/2)**n-((1-sqrt(5))/2)**n))

print([matrix_fib(n) for n in range(N)])

[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181]    
                            # 一模一样,不差分毫

猜你喜欢

转载自blog.csdn.net/qq_36369267/article/details/83033904