A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 sunhaodi 于 2012-6-20 15:35 编辑

*【程序1】   
题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?   
1.程序分析:   兔子的规律为数列1,1,2,3,5,8,13,21....   */

public class tuziwenti {

        public static long sum(int index) {
                long f1 = 1L;
                long f2 = 1L;
                long f = 0;
                for (int x = 0; x < index - 2; x++) { //这里应该是少2个月的
                        f = f1 + f2;   //这里是什么意思呢?
                        f1 = f2; //还有这
                        f2 = f; //这个
                }
                return f;

        }

        public static void main(String[] args) {
                System.out.println("一年下来共有兔子:" + sum(12));
        }

请把注释的地方详细讲解下。。。。

6 个回复

倒序浏览
本帖最后由 黑马—陈磊 于 2012-6-20 01:16 编辑


规律为数列1,1,2,3,5,8,13,21.... 按照规律写

for (int x = 0; x < index - 2; x++) { //这里应该是少2个月的--------->第1、2月均为一只兔子(出生后第3个月起每个月都生一对兔子)
                        f = f1 + f2;   //这里是什么意思呢?--------->规律前两个月的兔子数之和等于第三个月的兔子数
                        f1 = f2;
                        f2 = f; //这个              --------->(交换数)依次向后移,按照规律前两个月的兔子数之和等于第三个月兔子的数量,赋值后可以计算下一月  的兔子数
   }

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
f是当前的兔子个数,f1是一个月前兔子个数,f2是两个月前的兔子个数
每个月的兔子个数是前面两个月的兔子个数和,其实这题这样做不好,如果输入sum(1)或者sum(2)结果就不对了

        public static long sum(int index) {

                long f = 1L;
                long f1 = 0; //上个月的兔子个数
                long temp = 0;
                for (int x = 0; x < index; x++) {

                        temp = f;
                        f += f1;   //这个月的兔子数为前面两个月兔子数目之和
                        f1 = temp;  
                }
                return f;

        }

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
其实这个是一个数学问题:斐波那契数列:数列从第三项开始,每一项都等于前两项之和。 以下是我用递归方法写的实现程序:
public class Fibonacci{
public static void main(String args[]){
  int nums = fibonacci(8);
  System.out.println(nums);
}
  
  static int fibonacci(int n){
   if(n<=1) return 1;
   return fibonacci(n-1)+fibonacci(n-2);
   }
}
回复 使用道具 举报
本帖最后由 王明明 于 2012-6-20 11:11 编辑
  1. public class tuziDemo
  2.         {

  3.         public static long sum(int index)
  4.                         {
  5.                 long f1 = 1L;
  6.                 long f2 = 1L;
  7.                 long f = 0;
  8.                 for (int x = 0; x < index - 2; x++){  //这里应该是少2个月的 //因为1 2月 都是1对兔子 是从第三个月才开始累加的
  9.                         f = f1 + f2;   //这里是什么意思呢? //把前面2个月的兔子和 赋值给当月
  10.                         f1 = f2; //还有这 //把上上个月的兔子总和赋值给F1
  11.                         f2 = f; //这个  // 把当月总和赋值给F2 做好下次运算的准备

  12.                                                 //这个上面 你可以理解为是一个交换值的方式
  13.                                                                                System.out.println(f+f1+f2);
  14.                                                 
  15.                 }
  16.                 return f;

  17.         }

  18.         public static void main(String[] args) {
  19.                 System.out.println("一年下来共有兔子:" + sum(12));
  20.                 }
  21.         }
复制代码
你可以看下数组的规律 从第三月开始 前2个月的总和 等于当月兔子的数量

评分

参与人数 1技术分 +1 收起 理由
职业规划-刘倩老师 + 1 赞一个!

查看全部评分

回复 使用道具 举报
public class Test
{

        public static long sum(int index)
        {
                long f1 = 1L;
                long f2 = 1L;
                long f = 0;
                for (int x = 0; x < index - 2; x++)// 这里应该是少2个月的
                {
                        f = f1 + f2; // 这里是什么意思呢?
                        f1 = f2; // 还有这
                        f2 = f; // 这个

                        /*
                         *   首先楼主先明确一个知识, 这道题又叫裴波那契数列,也叫黄金分割数列,所以你以后面试或笔试的时候人家
                         *不一定给你完整的需求,就让你用java实现下裴波那契数列或黄金分割数列。所以你要会。
                         *   数列规律:从第三个数开始,后面的数等于前面两个数的和,2=1+1; 3=1+2, 5=2+3        ........
                         *   程序解释:为什么index - 2?从这个例子看前两个月的兔子数都是1对,从第三个月才开始增加,要是从裴波那契数列的角度来说,
                         * 前面的两个数字固定的,就是1和1。从第三个数开始计算。
                         *
                         *    循环内部:  当循环第一次执行的时候 f 等于第一个月加第二个月或者是按数列来说就是第一个数加上第二个数,即   2(f) = 1(f1) + 1(f2) ,
                         * 因为你下一次计算的时候需要第二个数加上第三个数才能计算出第四个数来 ,即: 3  =  1  +  2 也可以看作是3 =  1 + (1 + 1),所以你要把f2 赋值给f1
                         * 也就是说你要把上一次的第二个数当作下一次的第一个数,并且要把上一次计算的和当作下一次运算的第二个数,这就是为什么f2 = f;的原因。
                         *
                         *
                         */
                       
                        System.out.println(f + f1 + f2);
                }
                return f;
        }

        public static void main(String[] args)
        {
                System.out.println("一年下来共有兔子:" + sum(12));
        }
}

希望能帮到你,我觉得我说的够细的了

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
耿鑫 发表于 2012-6-20 13:17
public class Test
{

很详细,谢谢了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马