Java 兔子问题(斐波那契数列)扩展篇
斐波那契数列指的是这样一个数列 0, 1, 1, 2,3, 5, 8, 13, 21, 34, 55, 89, 144, ...对于这个数列仅仅能说将兔子生产周期第为3月。假设生成周期变成4月这个数列肯定不是这种,或者说兔子还有死亡周期,在这里我是对兔子生产周期没有限定。仅仅要月份大于生产周期都能够计算出第month月份究竟能产生多少对兔子。
Java兔子生殖问题
斐波那契数列又因数学家列昂纳多·斐波那契以兔子生殖为样例而引入。故又称为“兔子数列”。
一般而言,兔子在出生两个月后。就有生殖能力。一对兔子每一个月能生出一对小兔子来。假设全部兔子都不死,那么一年以后能够生殖多少对兔子?
我们最好还是拿新出生的一对小兔子分析一下:
第一个月小兔子没有生殖能力,所以还是一对
两个月后,生下一对小兔对数共同拥有两对
三个月以后。老兔子又生下一对。由于小兔子还没有生殖能力。所以一共是三对。
------
依次类推能够列出下表:
|
经过月数 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
|
幼仔对数 |
1 |
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 |
|
整体对数 |
1 |
1 |
2 |
3 |
5 |
8 |
13 |
21 |
34 |
55 |
89 |
144 |
233 |
幼仔对数=前月成兔对数
成兔对数=前月成兔对数+前月幼仔对数
整体对数=本月成兔对数+本月幼仔对数
能够看出幼仔对数、成兔对数、整体对数都构成了一个数列。这个数列有关十分明显的特点,那是:前面相邻两项之和,构成了后一项。
这个数列是意大利中世纪数学家斐波那契在<算盘全书>中提出的。这个级数的通项公式,除了具有a(n+2)=an+a(n+1)的性质外,还能够证明通项公式为:an=(1/√5)*{[(1+√5)/2]^n-[(1-√5)/2]^n}(n=1,2,3.....)。
JavaCode:
|
/* * System Abbrev : * system Name : * Component No : * Component Name: * File name :FabonacciSequence.java * Author :Peter.Qiu * Date :Aug 25, 2014 * Description : <description> */ /* Updation record 1: * Updation date : Aug 25, 2014 * Updator : Peter.Qiu * Trace No: <Trace No> * Updation No: <Updation No> * Updation Content: <List all contents of updation and all methods updated.> */ package com.qiuzhping.util.interesting; /** * <Description functions in a word> * <Detail description> * * @author Peter.Qiu * @version [Version NO, Aug 25, 2014] * @see [Related classes/methods] * @since [product/module version] */ public class FabonacciSequence { private static FabonacciSequence util = null; /** <default constructor> */ public FabonacciSequence() { // TODO Auto-generated constructor stub } /** <Description functions in a word> * Aug 25, 2014 * <Detail description> * @author Peter.Qiu * @param args [Parameters description] * @return void [Return type description] * @exception throws [Exception] [Exception description] * @see [Related classes#Related methods#Related properties] */ public static void main(String[] args) { long month = 8; long product = 4; long start = System.currentTimeMillis(); // System.out.println(" fabonacci \trabbit : "+getInstance().fabonacci(month)); // System.out.println(" take times = "+(System.currentTimeMillis() - start)/1000); // System.out.println("--------------------------------------"); // System.out.println(" fabonacci1 \trabbit : "+getInstance().fabonacci1(month)); // System.out.println(" take times = "+(System.currentTimeMillis() - start)/1000); // System.out.println("--------------------------------------"); // System.out.println(" fabonacci2 \trabbit : "+getInstance().fabonacci2(month,product)); // System.out.println(" take times = "+(System.currentTimeMillis() - start)/1000); for(long i = product; i <= month; i++){ System.out.println("month = "+i+"\tfabonacci2 \trabbit : "+getInstance().fabonacci2(i,product)); } } public static FabonacciSequence getInstance() { if (util == null) { util = new FabonacciSequence(); } return util; } /** <Description functions in a word> *pruduct month = 3<BR> * Aug 25, 2014 * <Detail description> * @author Peter.Qiu * @param month : How many months. * @return [Parameters description] * @return long [Return type description] * @exception throws [Exception] [Exception description] * @see [Related classes#Related methods#Related properties] */ public long fabonacci(long month) { if (!(month < 3)) { for (long i = 3; i <= month;) { return fabonacci(month - 1) + fabonacci(month - 2); } } return 1; } /** <Description functions in a word> * pruduct month = 3<BR> * Aug 25, 2014 * <Detail description> * @author Peter.Qiu * @param month :How many months. * @return [Parameters description] * @return long [Return type description] * @exception throws [Exception] [Exception description] * @see [Related classes#Related methods#Related properties] */ public long fabonacci1(long month) { long sum = 1, lastMonth = 1, lastLastMonth = 1; if (!(month < 3)) { for (long i = 3; i <= month; i++) { lastLastMonth = lastMonth; lastMonth = sum; sum = lastLastMonth + lastMonth; } } return sum; } /** <Description functions in a word> * Aug 25, 2014 * <Detail description> * @author Peter.Qiu * @param month:How many months. * @param pruductMonth:The production cycle. * @return [Parameters description] * @return long [Return type description] * @exception throws [Exception] [Exception description] * @see [Related classes#Related methods#Related properties] */ public long fabonacci2(long month, long pruductMonth) { long sum = 1; if (!(month < pruductMonth)) { for (long i = 0,j = pruductMonth - 1; i < month - (pruductMonth - 1); i++) { sum += fabonacci2(month - j - i, pruductMonth); } } return sum; } } |
以上这些算法都没有应用到面向对象的思维方式去解决,假设生成周期变成4月这个数列肯定不是这种,或者说兔子还有死亡周期,在这里我是对兔子生产周期没有限定,仅仅要月份大于生产周期都能够计算出第month月份究竟能产生多少对兔子。实际中能够将兔子定于为一个Rabbit对象,将其生产周期、死亡周期定义为属性。可能这个能有更好的效果。
Java 兔子问题(斐波那契数列)扩展篇的更多相关文章
- Java迭代实现斐波那契数列
剑指offer第九题Java实现 题目: 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项. public class Test9 { public static void ...
- Java练习 SDUT-1132_斐波那契数列
C/C++经典程序训练2---斐波那契数列 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 编写计算斐波那契(Fibon ...
- Java学习之斐波那契数列实现
描述 一个斐波那契序列,F(0) = 0, F(1) = 1, F(n) = F(n-1) + F(n-2) (n>=2),根据n的值,计算斐波那契数F(n),其中0≤n≤1000. 输入 输入 ...
- Python学习之斐波那契数列实现篇
描述 一个斐波那契序列,F(0) = 0, F(1) = 1, F(n) = F(n-1) + F(n-2) (n>=2),根据n的值,计算斐波那契数F(n),其中0≤n≤1000. 输入 输入 ...
- (java版)斐波那契数列
用JAVA编写Fibonacei(1,1,2,3,5,8,13...)数列的第n项 分析:当n=1时,a(n)=1;当n=2时 ,a(n)=2. 所以当n=>3时,a(n)=a(n-1)+a(n ...
- 简单Java算法程序实现!斐波那契数列函数~
java编程基础--斐波那契数列 问题描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 思路:可能出现的情况:(1) n=1 ,一种方法 ;(2)n=2 ...
- 斐波那契数列 的两种实现方式(Java)
import java.util.Scanner; /* 斐波那契数列:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ... 如果设F(n)为该数列的第n ...
- java大数 斐波那契数列
java大数做斐波那契数列: 思路:1. 2.可以用数组存着 import java.math.BigInteger; import java.util.Scanner; public ...
- 《剑指offer》第十题(斐波那契数列)
// 面试题:斐波那契数列 // 题目:写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项. #include <iostream> using namespace std; ...
- Java经典案例之-判断兔子的数量(斐波那契数列)
/** * 描述:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子, * 假如兔子都不死,问每个兔子总数为多少? * 分析:根据题目条件可以推断 * 兔子的规律 ...
随机推荐
- POJ 1849 树的直径 Two
如果一个点开始遍历一棵树再回到原点那么每条边走两次. 现在是两个人从同一点出发,那么最后遍历完以后两人离得越远越好. 最后两人所处位置的路径上的边走了一次,其他边走了两次. 要使总路程最小,两人最后停 ...
- 【02】xmind如何修改默认线条设置
[02]xmind如何修改不同主题的默认线条设置 魔芋:每次都是曲线.更喜欢为直线.因为曲线的路线是不确定的,看起来就显示很凌乱. 用everything搜索defaultStyles.xml ...
- 【01】如何在XMind中排列自由主题
如何在XMind中一招排列自由主题 在XMind思维导图软件中,用户可以随心所欲的添加自由主题,但由于自由主题的灵活性,造成了它的不整齐性,相对需要操持界面排列有序的用户来说,会造成一定的困扰. 第一 ...
- CentOS6.5的安装及忘记root密码的措施
CentOS6.5的安装及忘记root密码的措施 VMware虚拟机的配置 1.文件->新建->自定义->下一步 2.选择稍后安装操作系统 我们将采用自定义安装,杜绝VMware的一 ...
- 四、harbor实践之初识harbor
1 什么是Harbor harbor是VMware公司开源的企业级Registry项目,其的目标是帮助用户迅速搭建一个企业级的Docker registry 服务. 2 什么是Registry Reg ...
- c语言头文件以及make注意事项
c语言头文件以及make注意事项 头文件说明:自己定义的头文件和项目文件放在一起,注意使用""而不是使用<>,系统的头文件才使用<> 当main函数要调用其 ...
- 洛谷P2498 [SDOI2012]拯救小云公主 【二分 + 并查集】
题目 英雄又即将踏上拯救公主的道路-- 这次的拯救目标是--爱和正义的小云公主. 英雄来到boss的洞穴门口,他一下子就懵了,因为面前不只是一只boss,而是上千只boss.当英雄意识到自己还是等级1 ...
- writeValueAsString封装成工具类
封装成工具类 <span style="font-family:Microsoft YaHei;">public static String toJsonByObjec ...
- TYVJ3680 找妹子
时间: 1000ms / 空间: 1200KiB / Java类名: Main 背景 本题由 @fjzzq2002 提供,已奖励20金币. 描述 sps是zzq的好伙伴. sps一天叫来了许多个妹子. ...
- MongoDB数据关系的表达
虽说MongoDB是非关系型数据库,但由于大部分情况下数据之间是存在关系的,所以MongoDB也需要一些方式来表达数据之间的关系.MongoDB表达数据关系的方式有两种:文档嵌套和数据库引用. 一.文 ...