python语言实现斐波那契数列

斐波那契数列(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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值