斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*)
今天做了一个题目关于斐波那契数列的问题
然后分别用递归方法与迭代方法实现功能:
方法一:
方法一
a=[1,2]
for i in range(2,50):
a.append(a[i-1]+a[i-2])#根据斐波纳契数规律
#print(a[i-1]/a[i-2])#查看相邻两数比例是否接近黄金分割比
#print(a)#40000生成杨辉三角左对齐
if(a[i]>40000):
a.pop()#因为a[i]比预期多出来一项,所以要移除最后一项
break
print(a)#四万以下的斐波纳契数
#print((sum(a)+1)//2)#斐波纳契数列中偶数之和
##
[1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 286`
实现一:这样一个完全是自然数的数列,通项公式却是用无理数来表达的。而且当n趋向于无穷大时,前一项与后一项的比值越来越逼近黄金分割0.618(或者说后一项与前一项的比值小数部分越来越逼近0.618)`
2.0
1.5
1.6666666666666667
1.6
1.625
1.6153846153846154
1.619047619047619
1.6176470588235294
1.6181818181818182
1.6179775280898876
1.6180555555555556
1.6180257510729614
1.6180371352785146
1.618032786885246
1.618034447821682
1.6180338134001253
1.618034055727554
1.6180339631667064
1.6180339985218033
1.618033985017358
1.6180339901755971
实现二:杨辉三角
[0, 1, 1]
[0, 1, 1, 2]
[0, 1, 1, 2, 3]
[0, 1, 1, 2, 3, 5]
[0, 1, 1, 2, 3, 5, 8]
[0, 1, 1, 2, 3, 5, 8, 13]
[0, 1, 1, 2, 3, 5, 8, 13, 21]
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144]
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233]
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377]
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610]
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987]
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597]
实现三:斐波那契数列元素中偶数之和
发现该数列中偶数相加,
2+8+34+144…….=2+3+5+34+55…….
受启发得:
偶数和s1,总和s
s1+s1+1=s+2
所以:
s1=(s+1)/2
print((sum(a)+1)//2)#斐波纳契数列中偶数之和
#方法二:
def fun(n):
if n==0:
return 0
if n==1:
return 1
return fun(n-1)+fun(n-2)
a=[None]*50
for i in range(1,50):
if fun(i)<40000:
a[i]=fun(i)
else:
break
print(a)
方法三:
#方法三
def fibo(n):
x, y = 0, 1
while(n):
x,y,n = y, x+y, n - 1
return x
a=[0]*50
for i in range(1,50):
if fibo(i)<40000:
a[i]=fibo(i)
else:
break
print(a)