【算法】斐波那契数列
主要内容:
- 斐波那契数列(兔子问题)
- 递归算法和递推算法
斐波那契数列(兔子问题)
问题描述:刚出生的兔子,长到第三个月开始(忽略月份大小)就可以繁殖下一代。假如1月1日抱来一公一母两只兔子,那么3月1日时,就会生出第一代兔子,并且正好也是一公一母。假设兔子没有死亡,每代兔子都可以正常繁殖下一代,那么计算抱来一对兔子第N月时,兔子的总量是多少对。(刚抱来算第一个月)
观察可知,从第三月开始,每个月的兔子总量等于前两个月的兔子总量之和,由此,便很容易确定其可以用斐波那契数列的思路来解决。
公式:Fib(n)=Fib(n-1)+Fib(n-2),n>3
现在来使用代码实现,我使用的是java来实现
递归算法和递推算法
package lucas; import java.util.Scanner; /**兔子问题<br/> * 问题描述:<br/> * 刚出生的兔子,长到第三个月开始(忽略月份大小)就可以繁殖下一代。<br/> * 假如1月1日抱来一公一母两只兔子,那么3月1日时,就会生出第一代兔子,并且正好也是一公一母。<br/> * 假设兔子没有死亡,每代兔子都可以正常繁殖下一代, * 那么计算抱来一对兔子第N月时,兔子的总量是多少对。(刚抱来算第一个月) * @author LENOVO * */ public class Rabbit { //递归,斐波那契数列 public static double Fib(double n){ if(n==1.0||n==2.0){ return 1.0; }else{ return Fib(n-1.0)+Fib(n-2.0); } } public static void main(String[] args) { /* * 由题意可知,兔子序列从第三个月开始, * 每个月的数据是前两个月的和,所以很容易想到递归 * 使用double(8字节)可以容纳很大的数字 * 用递归很慢,只适合小一点的数字。 * */ double f,n; System.out.print("抱来兔子的第N月:"); Scanner sc=new Scanner(System.in); n=sc.nextDouble(); System.out.print("当前兔子总量(对):"); f=Fib(n); System.out.format("%.0f",f); } }
得到的结果(真的很慢):
兔子的增长序列是斐波那契数列,所以考虑使用递推算法。
递推算法要比递归速度快很多,空间占用也少很多。
package lucas; import java.util.Scanner; /**兔子的增长序列是斐波那契数列,所以考虑使用 * 递推算法。<br/> * 递推算法要比递归速度快很多,空间占用也少很多。 * @author LENOVO * */ public class Rabbit2 { public static void main(String[] args) { double f,n,i; double a,b;//存储前2个月兔子总量 System.out.println("抱来兔子的第n月:"); Scanner sc=new Scanner(System.in); n=sc.nextDouble(); a=b=f=1.0; //从第3月才开始累加 for(i=3.0;i<=n;i++){ f=a+b;//计算第i月的数量 a=b; b=f; } System.out.print("当前兔子总量(对)"); System.out.format("%.0f",f); } }
结果显示(真的是秒速):
参考自:http://www.cnblogs.com/kangjianwei101/p/5221542.html

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
通通WPF随笔(4)——通通手写输入法(基于Tablet pc实现)
原文: 通通WPF随笔(4)——通通手写输入法(基于Tablet pc实现) 从我在博客园写第一篇博客到现在已经有1年半了,我的第一篇博客写的就是手写识别,当时,客户需求在应用中加入手写输入功能,由于第三方的手写输入法都无法定制界面,所以领导决定自主开发,所以我就很简单地基于Tablet pc写了一个WPF控件,由于几个瓶颈问题,导致这个输入功能只能在我们的UI框架里使用,而无法做到像输入法那样可以输入到任意窗口。 时隔1年半,随着各种项目的磨练,知识的积累几个问题得以解决,于是就产生了这个手写输入法。 ICO: UI: 符号识别: 识别率还是比较高的 界面风格是1年半前设计的,当时觉得《创世纪》的视觉效果挺牛X的。 因为是针对于触摸设备设计的,所以没有做退出按钮,由应用来控制关闭。PC上的话,在空白处左键可以拖动,点击右键关闭窗口。 一、瓶颈问题 由于本人C#出身,实在不想去研究什么IME等等底层的输入法机制,所以就写个exe实现输入法的功能。就面临下面几个问题: 1、如何向其他窗口发送输入消息呢? 2、如何知道当前键盘焦点所在窗口呢? 3、如何在操作输入...
- 下一篇
SQL Server 死锁的告警监控
原文: SQL Server 死锁的告警监控 今天这篇文章总结一下如何监控SQL Server的死锁,其实以前写过MS SQL 监控错误日志的告警信息,这篇文章着重介绍如何监控数据库的死锁,当然这篇文章不分析死锁产生的原因、以及如何解决死锁。死锁(Dead Lock)的错误信息在sys.messages中的message_id为1205,可以使用下面SQL查看。 SELECT * FROM sys.messages WHERE message_id=1205 那么接下来,我们来设置一下死锁(Dead Lock)告警吧, 如下所示,当然你可以使用UI界面设置。 USE [msdb] GO IFNOTEXISTS(SELECT 1 FROM msdb.dbo.syscategories WHERE NAME='DBA_MONITORING'AND category_class=2) BEGIN EXEC msdb.dbo.sp_add_category @class=N'ALERT', @type=N'NONE', @name=N'DBA_MONITORING' ;...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- 设置Eclipse缩进为4个空格,增强代码规范
- SpringBoot2全家桶,快速入门学习开发网站教程
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Red5直播服务器,属于Java语言的直播服务器
- CentOS8安装Docker,最新的服务器搭配容器使用
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS7安装Docker,走上虚拟化容器引擎之路