• Java 兔子问题(斐波那契数列)扩展篇


     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  rabbit : "+getInstance().fabonacci(month));

    //            System.out.println(" take times = "+(System.currentTimeMillis() - start)/1000);

    //            System.out.println("--------------------------------------");

    //            System.out.println(" fabonacci1 rabbit : "+getInstance().fabonacci1(month));

    //            System.out.println(" take times = "+(System.currentTimeMillis() - start)/1000);

    //            System.out.println("--------------------------------------");

    //            System.out.println(" fabonacci2 rabbit : "+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+" fabonacci2 rabbit : "+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对象,将其生产周期、死亡周期定义为属性。可能这个能有更好的效果。


  • 相关阅读:
    2013国内IT行业薪资对照表【技术岗位】
    Eclipse查看子类
    whereis 查找命令全路径
    开张了
    Ruby1.8中单行字符串写在多行
    FEMTO是什么
    FUSE文件系统
    魔兽私服pvpgn搭建
    linux网络源码分析(1)
    freehosting申请空间和ssh D设置
  • 原文地址:https://www.cnblogs.com/llguanli/p/6869588.html
Copyright © 2020-2023  润新知