python斐波那契数列前20项_斐波那契数列变形题(Python求解)-程序员宅基地

技术标签: python斐波那契数列前20项  

587d37ab7f39c6032df7f17464b153df.png

上周数据团的学习群中,有个同学抛出一个用Python编写函数求解的问题,激发了近500条的讨论,下面是题目:

一个农场有一头牛,每头牛的寿命都是六年,然后每头牛在第三年和第五年都会生一头牛,问,若干年后有多少条牛。用Python进行编写函数,输入年份求解。

接下来介绍下我的解题思路:

第一步:按照题意,每年牛的数量最直接关联的是上年的牛=上一年牛龄1至5数量之和(牛龄6在本年死去)+上一年牛龄3与5数量之和(每头牛在第三年和第五年都会生一头牛),这个时候就可以把每年的牛数量与牛龄组成一个列表,这一步就是把问题拆解成最小的组成结构,然后按照这个我编写Python。

def cow_quantity(year):
    df = pd.DataFrame({'第1年':[1,0,0,0,0,0]},
                 index = ['1岁数量','2岁数量','3岁数量','4岁数量','5岁数量','6岁数量'])
    #生成第一年的数据
    for i in range(year+1):  #按照需要求的年来遍历,没一年加一列
        if i%2 == 1 and i > 1: #如果是奇数年,上一年有牛龄3与5的牛,这里我是观察到规律优化了下
            df['第{}年'.format(i)] = df.shift(1)['第{}年'.format(i-1)]
            df['第{}年'.format(i)][0] = df['第{}年'.format(i-1)][:5].sum()
        if i%2 == 0 and i > 1:  #如果是偶数年,上一年没有牛龄3与5的牛
            df['第{}年'.format(i)] = df.shift(1)['第{}年'.format(i-1)]
            df['第{}年'.format(i)][0] = 0
    return(df)
print(cow_quantity(19).sum())
cow_quantity(15)

接下来运行代码,查看输出结果看有没有需要调整的,我输出了每年的牛数量之和与每年的列表。

首先是每年的数量之和。

c7bfdd985fbb3c939be4ae536500f1f1.png

然后是列表:

149b9dcb6b56a3bfd5cd342b83989785.png

经过检测数据结果是正确的,但面临几个问题:

  1. 每次求需要年数的牛数量,这个程序都需要从头开始运算,计算量很大,如果 运算第1000年的数量之和需要比较长时间,数据再大些计算力不足以支撑运算。
  2. 只按最开始的规律编写了计算,还没有推导简化规律,直到不能推导

第二步:解决第一步遇到的问题

首先观察每年牛的数量汇总列表(即第一个图),除了没两年牛的数量是相同的没找到能解出牛数量的规律。

然后观察计算列表(即第二个图),这个时候发现每个牛龄的行数据都是一个变形后的斐波那契数列,1岁数量的行在斐波那契数列每两项中间加了一个0,下面每一行的数据都是上一行的数据右移一位得到的。这个时候我想到了可以用斐波那契数列的通项式来求得对应年数的牛数量之和。

3b697eee75c6d096b81b558aeba1fc54.png
#按照通项式写出代码
def cow_quantity_formula(year):
    import math
    if year % 2 == 0:
        n = year/2
        quantity = (1/math.sqrt(5))*((((1+math.sqrt(5))/2))**n-(((1-math.sqrt(5))/2)**n)) + (1/math.sqrt(5))*((((1+math.sqrt(5))/2))**(n-1)-(((1-math.sqrt(5))/2)**(n-1))) + (1/math.sqrt(5))*((((1+math.sqrt(5))/2))**(n-2)-(((1-math.sqrt(5))/2)**(n-2)))
    if year % 2 == 1:
        n = (year+1)/2
        quantity = (1/math.sqrt(5))*((((1+math.sqrt(5))/2))**n-(((1-math.sqrt(5))/2)**n)) + (1/math.sqrt(5))*((((1+math.sqrt(5))/2))**(n-1)-(((1-math.sqrt(5))/2)**(n-1))) + (1/math.sqrt(5))*((((1+math.sqrt(5))/2))**(n-2)-(((1-math.sqrt(5))/2)**(n-2)))
    return(int(quantity))
cow_quantity_formula(19)

推导简化后的函数求第1000年牛的数量之和用时32毫秒。

这个推导结果优点是计算速度快了,缺点是不够准确(因为通项式中的根号5不是整数)。可以在满足一些条件时使用这个方法。另外数据团中还有其他同学用其他方式编写的代码,用了最简单的计算方式,优点是计算时间快,耗费计算机资源小。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_39644325/article/details/110975383

智能推荐

Python 面向对象编程_if hasattr(target, "java"):-程序员宅基地

文章浏览阅读215次。本篇内容:  1、反射  2、面向对象编程  3、面向对象三大特性  4、类成员  5、类成员修饰符  6、类的特殊成员  7、单例模式反射python中的反射功能是由以下四个内置函数提供:hasattr、getattr、setattr、delattr,改四个函数分别用于对对象内部执行:检查是否含有某成员、获取成员、设置成员、删除成员。 _if hasattr(target, "java"):

C# Core1.1 版本 AppSettings 使用方法_c# appsettings写在startup哪里-程序员宅基地

文章浏览阅读770次。1:在AppSettings.json 里书写格式为:"AppSettings":{"key":"value","key":"value"};2::Start up.cs里新增配置 public void ConfigureServices(IServiceCollection services) { services.AddOptions(_c# appsettings写在startup哪里

中望cad自定义快捷键命令_很多CAD大神都善用专属快捷键,掌握AutoCAD自定义快捷键受益匪浅...-程序员宅基地

文章浏览阅读1.2k次。阅读完,如果觉得有用,那么点击"关注"和点赞是对作者的一种尊重和鼓励。版权所有,抄袭必究。作者的新书《AutoCAD 2020中文版入门-进阶-精通(第6版)》已经正式出版,敬请关注,谢谢。内容提要:在实际工作中,掌握了AutoCAD快捷键可以提高绘图效率。那么有没有想过除了AutoCAD系统自身的默认快捷键之外,还可以为自己常用的工具命令设置专属个人的快捷键呢?本文专门介绍AutoCAD自定义快..._中望cad2021机械版快捷键

kohana简介-程序员宅基地

文章浏览阅读108次。2019独角兽企业重金招聘Python工程师标准>>> ..._kohana是什么洗发水

QT中UDPSocket丢包问题_qt udp 丢包考核-程序员宅基地

文章浏览阅读8.9k次,点赞4次,收藏43次。Qt中的QUdpSocket发生严重丢包现象,在Linux下使用while死循环接收来解决,但存在CPU占用率太高的问题。_qt udp 丢包考核

Python中出现UnboundLocalError: local variable ‘xxx‘ referenced before assignment情况的解决方法_unboundlocalerror: local variable 'sentencepiece_m-程序员宅基地

文章浏览阅读2w次,点赞14次,收藏11次。UnboundLocalError: local variable 'xxx' referenced before assignment在函数外部已经定义了变量n,在函数内部对该变量进行运算,运行时会遇到了这样的错误:主要是因为没有让解释器清楚变量是全局变量还是局部变量。有时候在其他模块声明该变量,在本模块使用时也会出现。那么问题就来了,出现这个问题我们就要考虑程序是按照全局变量,就是经过函数运算到函数外面还生效,还是按照局部变量在函数外生效。第一种,当全局变量来看,就是使用global..._unboundlocalerror: local variable 'sentencepiece_model_pb2' referenced befor

随便推点

QTableWidget控件总结-程序员宅基地

文章浏览阅读51次。1,设置QTableWidget滚动条宽度。myTableWidget->verticalScrollBar()->setStyleSheet("QScrollBar:vertical { width: 100px; }");QTableWidget详解(样式、右键菜单、表头塌陷、多选等) (2013-05-15 09:24:53)转载▼标..._qtablewidget控件自绘

python中获得字符串s长度的方法是什么_获得字符串s长度的方法是什么?【 】(8.0分)_学小易找答案...-程序员宅基地

文章浏览阅读2.1k次。【名词解释】多功能酶【填空题】维生素B6包括______、______、______三种物质【判断题】Python是一种开源、免费的高级动态编程语言。 (5.0分)【简答题】请写出程序运行后显示结果(8分) def f(a,b,op): print(eval(a+op+b)) x = '5678' y = '1234' z = '%+-*' for a,b,op in zip(x,y,z): f(..._python中获得字符串 s长度的方法是:

UWP 手绘视频创作工具技术分享系列 - 有 AI 的手绘视频-程序员宅基地

文章浏览阅读74次。原文:UWP 手绘视频创作工具技术分享系列 - 有 AI 的手绘视频AI(Artificial Intelligence)正在不断的改变着各个行业的形态和人们的生活方式,图像识别、语音识别、自然语言理解等 AI 技术正在自动驾驶、智能机器人、人脸识别、智能助理等领域中发挥着越来越重要的作用。那么当手绘视频遇到 AI,有 AI 的手绘视频领域,有 AI 的 UWP 手绘视频创作工具,会发生些什么..._autodraw uwp

dBm&dBFs_dbfs dbm-程序员宅基地

文章浏览阅读1k次,点赞2次,收藏12次。dBm与dBFs的定义、区别以及二者的相互转换关系_dbfs dbm

CAM论文翻译_zhou等人[59]在最终输出层(在分类的情况下为softmax函数)之前,对最后一层卷积里的-程序员宅基地

文章浏览阅读187次。在这项工作中,我们重新审视了文献[13]中提出的全局平均池化层,并阐明了它如何明确地使卷积神经网络具有出色的定位能力,尽管该网络是在图像级标签上进行训练的。虽然此技术先前被提出作为一种规范化训练的手段,但我们发现它实际上构建了一种通用的可定位深层表示,可应用于各种任务。尽管全局平均池化看似简单,我们在ILSVRC 2014的对象定位任务上实现了37.1%的前5错误率,这与完全监督的CNN方法所达到的34.2%的前5错误率非常接近。_zhou等人[59]在最终输出层(在分类的情况下为softmax函数)之前,对最后一层卷积里的

Java面试的问题_java中的两个重载函数,如果只有几行代码不同,改如何设计-程序员宅基地

文章浏览阅读467次。1、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制?可以有多个类,但只能有一个public的类,并且public的类名必须与文件名相一致。2、Java有没有goto?java中的保留字,现在没有在java中使用。 3、说说&和&&的区别。&和&&都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为true时,整个运算结果才为true,否则,只要有一方为false,则结果为fa_java中的两个重载函数,如果只有几行代码不同,改如何设计

推荐文章

热门文章

相关标签