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 兔子问题(斐波那契数列)扩展篇的更多相关文章

  1. Java迭代实现斐波那契数列

    剑指offer第九题Java实现 题目: 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项. public class Test9 { public static void ...

  2. Java练习 SDUT-1132_斐波那契数列

    C/C++经典程序训练2---斐波那契数列 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 编写计算斐波那契(Fibon ...

  3. Java学习之斐波那契数列实现

    描述 一个斐波那契序列,F(0) = 0, F(1) = 1, F(n) = F(n-1) + F(n-2) (n>=2),根据n的值,计算斐波那契数F(n),其中0≤n≤1000. 输入 输入 ...

  4. Python学习之斐波那契数列实现篇

    描述 一个斐波那契序列,F(0) = 0, F(1) = 1, F(n) = F(n-1) + F(n-2) (n>=2),根据n的值,计算斐波那契数F(n),其中0≤n≤1000. 输入 输入 ...

  5. (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 ...

  6. 简单Java算法程序实现!斐波那契数列函数~

    java编程基础--斐波那契数列 问题描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 思路:可能出现的情况:(1) n=1 ,一种方法 ;(2)n=2 ...

  7. 斐波那契数列 的两种实现方式(Java)

    import java.util.Scanner; /* 斐波那契数列:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ... 如果设F(n)为该数列的第n ...

  8. java大数 斐波那契数列

    java大数做斐波那契数列:  思路:1.       2.可以用数组存着 import java.math.BigInteger; import java.util.Scanner; public ...

  9. 《剑指offer》第十题(斐波那契数列)

    // 面试题:斐波那契数列 // 题目:写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项. #include <iostream> using namespace std; ...

  10. Java经典案例之-判断兔子的数量(斐波那契数列)

    /** * 描述:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子, * 假如兔子都不死,问每个兔子总数为多少? * 分析:根据题目条件可以推断 * 兔子的规律 ...

随机推荐

  1. GitHub中国区前100名到底是什么样的人?(转载)

    本文根据Github公开API,抓取了地址显示China的用户,根据粉丝关注做了一个排名,分析前一百名的用户属性,剖析这些活跃在技术社区的牛人到底是何许人也!后续会根据我的一些经验出品<技术人员 ...

  2. 在web中绘制图像 -- canvas篇

    汗,不小心点击发布了.其实正在编辑中...... HTML Canvas是现代浏览器中非常棒的绘图技术,Canvas可以绘制图形,操作图片,制作游戏,创建动画等:Canvas是很容易使用的,下面我们来 ...

  3. 牛腩新闻发布系统(三):CSS盒子模型及其基本内容

    导读: 这些天一直在做牛腩的网页,比如什么首页.出错页.新闻内容页等.在学习的不断推进中,一些刚开始理解的不是很好的东西,也逐渐的深刻了起来.下面,就对这一段时间的学习,做一个总结.主要总结内容有:盒 ...

  4. 九度oj 题目1254:N皇后问题

    题目描述: N皇后问题,即在N*N的方格棋盘内放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在同一斜线上.因为皇后可以直走,横走和斜走如下图). 你的任务是,对 ...

  5. LDP协议详解-上

    MPLS基础 模式 标签分配模式(label allocation)本地为一条路由前缀绑定一个label标签的条件.独立控制模式(independent control)本地RIB学习到的路由(除BG ...

  6. iOS学习笔记19-地图(一)定位CoreLocation

    一.定位介绍 现在很多社交.电商.团购应用都引入了地图和定位功能,似乎地图功能不再是地图应用和导航应用所特有的.的确,有了地图和定位功能确实让我们的生活更加丰富多彩,极大的改变了我们的生活方式.要实现 ...

  7. 【2018.10.18】CXM笔记(动态规划)

    1.给你一棵树,让你修任意多条点不相交的铁路(每条铁路都是一根链),定义一个点的代价为它到根节点的路径中不在铁路上的边数,求一种设计方案代价最大的点最小. 铁路点不相交与 每个点连出去的铁路条数 $\ ...

  8. 【bzoj2751】[HAOI2012]容易题(easy) 数论,简单题

    Description 为了使得大家高兴,小Q特意出个自认为的简单题(easy)来满足大家,这道简单题是描述如下:有一个数列A已知对于所有的A[i]都是1~n的自然数,并且知道对于一些A[i]不能取哪 ...

  9. 【bzoj1483】[HNOI2009]梦幻布丁 set

    [bzoj1483][HNOI2009]梦幻布丁 Description N个布丁摆成一行,进行M次操作.每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色.例如颜色分别为1,2 ...

  10. BZOJ 4808 马 二分图最大独立集

    题目应该就是最大独立集了吧,没什么了,平面图求最大独立集需要/2的, WQH说加直接+双向边考研过,结果真的过了,应该是匈牙利算法寻找的 时候更加快了吧.(方便找边) #include<cstd ...