发现CSDN上没有相似的文章,第一次写分享,有不足请见谅
仅从纯数学的方法上设计得到斐波那契数列,共两种大同小异的方法。
1. 使用fai1, fai2(具体定义见下文)
斐波那契数列和黄金分割率φ及其共轭数(该字母不知道如何输入)有关,有:
- 黄金分割率 fai1 = (1+5^0.5)/2 = 1.661803...
- 黄金分割率的共轭 fai2 = (1-5^0.5)/2 = -0.61803...
Fi为斐波那契数列的第i个数,i从0开始,有F(0)=0,F(1)=1,有:
Fi = (fai1 - fai2)/ (5^0.5)
代码如下:
def fib(b):
a = []
fai1 = (1 + 5 ** 0.5) / 2
fai2 = (1 - 5 ** 0.5) / 2
for i in range(n):
f = (fai1 ** i - fai2 **i) / (5 ** 0.5)
a.append(int(f))
return a
n = 11
A = fib(n)
print(A)
# 结果为:[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
2. 只使用fai1
因为|fai2|<1
可以使用归纳法证明 (|fai2^i| / 5^0.5) < 1 /( 5^0.5) < 1 / 2
所以一定有Fi = floor((|fai1^i| / 5^0.5)+ 1 / 2 ),即Fi等于(|fai1^i| / 5^0.5)舍入到最近的整数
代码如下:
def fib(b):
a = []
fai1 = (1 + 5 ** 0.5) / 2
for i in range(n):
f = round((fai1 ** i) / (5 ** 0.5))
a.append(int(f))
return a
n = 13
A = fib(n)
print(A)
# 结果为:[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144]
总结:
一个根据数学公式的尝试,在只需要斐波那契数列中的第i项时,感觉比较适用。