Python | 递归函数实现斐波那契数列

一、斐波那契数列的简单介绍

1、什么是斐波那契数列?

斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家莱昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……

斐波那契数列由 0 和 1 开始,之后的斐波那契数列系数由之前的两数相加得出

2、斐波那契的神奇之处

也许你觉得,这么一串数有什么用,我平常也用不到,但实际上,很多地方都有斐波那契数列的影子。

  • 兔子数列

比如,我开篇提到的“兔子数列”。假设一开始有两只兔子,一公一母,两个月后开始繁殖,一对兔子每个月能且只能生出一对小兔子来,假设兔子都不会死亡,那么一年之后可以繁殖多少对兔子?

分析:
第一个月和第二个月,兔子没有繁殖能力,所以是一对;
第三个月,兔子有了繁殖能力,生下了一对小兔子,现在兔子是两对;
第四个月,大兔子依旧可以生下一对小兔子,由于现在小兔子还未成年,没有繁殖能力,所以,现在兔子是三对;
四个月后,小兔子长大了成为了小老兔子,可以和大老兔子一起繁殖,这时候就拥有了五对兔子;
……

以此类推我就得到了这样一串数:
1,1,2,3,5,8,13,21…

  • 与黄金分割比的关系
    斐波那契数列从第三项开始,每一项都等于前两项的和。
    它的通项公式为:

[(1+√5)/2]^n /√5 - [(1-√5)/2]^n /√5 【√5表示根号5】

1÷1=1,1÷2=0.5,2÷3=0.666…,3÷5=0.6,5÷8=0.625,55÷89=0.617977……
144÷233=0.618025…46368÷75025=0.6180339886……
当而且当n趋向于无穷大时,前一项与后一项的比值越来越逼近黄金分割0.618

二、递归实现斐波那契数列

代码:

def fibo(n):
    """递归函数实现斐波那契数列"""
    if n == 1 or n == 2:
        return 1
    else:
        return fibo(n-1) + fibo(n -2)


if __name__ == '__main__':
    n = int(input("请输入数列的项数:"))
    res = fibo(n)
    print(res)

运行结果:

请输入数列的项数:9
34

三、一行代码实现斐波那契数列

n = int(input("请输入数列的项数:"))
fibo = [x[0] for x in [(a[i][0], a.append([a[i][1], a[i][0]+a[i][1]])) for a in ([[1, 1]], ) for i in range(n)]]
print(fibo)

四、问题总结

1. RecursionError: maximum recursion depth exceeded in comparison
  • 问题描述:递归超过了最大的深度
  • 问题原因: python的递归深度默认为1000。当递归深度超过1000时,就会报错。
  • 解决方法:将递归的深度修改的大一些
    import sys
    sys.setrecursionlimit(100000)
    
  • 查看递归层数
    def recursion(depth):
        depth += 1
        print(depth)
        recursion(depth)
    
    recursion(0)
    
  • 34
    点赞
  • 100
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值