黑马程序员技术交流社区

标题: java算法,问问自己能不能独自做出来,明天下午公布答案! [打印本页]

作者: 黄宝宝    时间: 2014-7-31 23:55
标题: java算法,问问自己能不能独自做出来,明天下午公布答案!
    古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,
    小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?   
   1.程序分析:   兔子的规律为数列1,1,2,3,5,8,13,21....


作者: masai158    时间: 2014-7-31 23:59
这是一道递归题。好了。睡觉了。明天等你公布答案了
作者: 科篮    时间: 2014-8-1 00:00
递归,斐波拉侧数列
作者: 韩天雷    时间: 2014-8-1 00:34
  1. public class Rabbit {
  2.         public static void main(String[] args) {
  3.                 long f1, f2;
  4.                 int i;
  5.                 f1 = f2 = 1;
  6.                 for (i = 1; i <= 20; i++) {
  7.                         System.out.println(f1 + "\r\n" + f2);
  8.                         f1 = f1 + f2; // 前两个月加起来赋值给第三个月
  9.                         f2 = f1 + f2; // 前两个月加起来赋值给第三个月
  10.                 }
  11.         }
  12. }
复制代码

作者: chulangren2    时间: 2014-8-1 00:40
递归算法。
作者: M单色调    时间: 2014-8-1 00:51
这个是斐波那切数列!这是基础测试吧?
作者: 黄宝宝    时间: 2014-8-1 01:13
:D,好吧,看来不用我公布答案了!觉得简单的做做那位点评兄弟加的料啊!必须用递归,且在运行程序后1秒之内算出第50个月的兔子数
我想了一下,不会做!我太菜了!求解答!
作者: 黄宝宝    时间: 2014-8-1 01:14
M单色调 发表于 2014-8-1 00:51
这个是斐波那切数列!这是基础测试吧?

不知道啊,书上看的题目!
作者: 戒风    时间: 2014-8-1 07:21
我用c做过,递归……
作者: 黎志勇    时间: 2014-8-1 08:18
本帖最后由 黎志勇 于 2014-8-1 08:53 编辑

这算不算做出来了?

  1. package test;

  2. public class Test19 {
  3.         public static void main(String[] args) {
  4.                
  5.                 for (int i = 0; i <= 50; i++) {
  6.                         try {
  7.                                 test(i);
  8.                         } catch (Exception e) {
  9.                                 continue;
  10.                         }
  11.                 }
  12.                
  13.         }
  14.         
  15.         public static void test(int num) {
  16.                 long start = System.currentTimeMillis();
  17.                 long count = rabbitMethod(num);
  18.                 long end = System.currentTimeMillis();
  19.                 System.out.println("第"+num+"个月会有"+count+"对兔子,计算耗时"+(end-start)+"毫秒");
  20.         }
  21.         
  22.         public static long rabbitMethod(int num){
  23.                 if(num<1) {
  24.                         throw new RuntimeException("操作错误,错误操作数:"+num);
  25.                 }
  26.                 if (num<3) {
  27.                         return 1;
  28.                 } else {
  29.                         long f1 = 1, f2 = 1;
  30.                         return getCount(2,num,f1,f2);
  31.                 }
  32.                
  33.         }

  34.         private static long getCount(int now, int num, long f1, long f2) {
  35.                 if(now == num) {
  36.                         return f2;
  37.                 }
  38.                 return getCount(now+1, num, f2, f1+f2);
  39.         }
  40. }
复制代码
那递归实际上就是个while循环,可以合并成这样
  1.         public static long rabbitMethod(int num){
  2.                 if(num<1) {
  3.                         throw new RuntimeException("操作错误,错误操作数:"+num);
  4.                 }
  5.                 if (num<3) {
  6.                         return 1;
  7.                 } else {
  8.                         long f1 = 1, f2 = 1;
  9.                         long temp = 0;
  10.                         int now = 2;
  11.                         while (now<num) {
  12.                                 temp = f1 + f2;
  13.                                 f1 = f2;
  14.                                 f2 = temp;
  15.                                 now++;
  16.                         }
  17.                         return f2;
  18.                 }
  19.                
  20.         }
复制代码


作者: 王飞163    时间: 2014-8-1 08:30
高手自在民间啊!
作者: 赵顺超    时间: 2014-8-1 08:32
黄宝宝 发表于 2014-8-1 01:13
,好吧,看来不用我公布答案了!觉得简单的做做那位点评兄弟加的料啊!必须用递归,且在运行程序后1秒之 ...

不用递归也能做
作者: M单色调    时间: 2014-8-1 08:37
黄宝宝 发表于 2014-8-1 01:14
不知道啊,书上看的题目!

我的基础测试就有这道提。。
作者: 周峰峰    时间: 2014-8-1 08:49
等着公布答案
作者: 孤守星空    时间: 2014-8-1 09:09
怎么觉得我好像见过
作者: 禅伤    时间: 2014-8-1 09:18
  就是斐波那契数列,我基础测试做过




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2