zoukankan      html  css  js  c++  java
  • 兔子生兔子问题(斐波那契数列)

    一道经典的算法问题。

    题目:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子。假如兔子都不死,要求输出一年内兔子的数量是多少。

    1 1 2 3 5 8……

    代码如下:

    //兔子问题(斐波那契)
    package com.hxzy.homework;
     
    public class HomeWork05 {
     
        public static void main(String[] args) {
          // TODO Auto-generated method stub
           int month = 12;
             int sum = fab(month);
             System.out.println(sum);  //按兔子繁殖规律
           System.out.println(fab_1(month));  //按斐波拉契
        }
    //--------按兔子繁殖规律    
    static int fab(int month){
            if(month<=2)
                return 1;
            else if(month==3)
                return 2;
            else
                return 2*fab(month-1)-fab(month-3);
    //         即 return fab(month-1) +(fab(month-1)-fab(month-2)) +(fab(month-2)-fab(month-3));
    //          返回值为,上月兔子数+上月增加的兔子数+两个月前新增兔子数
        }
    //--------------按斐波拉契
        static int fab_1(int n){
            if(n<=2return 1;
            else return fab_1(n-1)+ fab_1(n-2);
        }
    }

    用递归法求解最简单,上面代码fab()是根据题意写出的代码。由于兔子第三个月开始会生小兔子,所以此道题目的关键逻辑是:

    本月兔子数=上月兔子数 + 上月增加的兔子数 + 两个月前新增兔子数,

    即:fab(n) = fab(n-1) +(fab(n-1)-fab(n-2)) + (fab(n-2)-fab(n-3));

    亦即:fab(n)=2*fab(n-1) - fab(n-3)

    这一逻辑较斐波那契数列更好理解。

  • 相关阅读:
    OCP-052考试题库汇总(35)-CUUG内部解答版
    OCP-052考试题库汇总(34)-CUUG内部解答版
    018 ThreadLocal实现线程安全
    017 无锁与CAS
    016 原子类
    015 可见性问题与volatile
    014 锁重入
    013 synchronized的优化
    012 内置锁和synchronized
    011 线程安全性问题
  • 原文地址:https://www.cnblogs.com/coolyouguo/p/11990935.html
Copyright © 2011-2022 走看看