黑马程序员技术交流社区

标题: 关于兔子生兔子的一个景点问题的提问 [打印本页]

作者: 刘建龙    时间: 2012-6-14 21:46
标题: 关于兔子生兔子的一个景点问题的提问
本帖最后由 刘建龙 于 2012-6-20 14:12 编辑

今天看到一道题:但是算了半天也没有找到规律!虽然看了答案,但是还是不清楚该如何思考,运算。特此求助!请各位大神详细的讲解一下这类题的思考方法,及编程技巧,特此感谢!
题目如下:

题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子对数为多少?
代码如下:
public class Prog1{
public static void main(String[] args){
int n = 10;
System.out.println(""+n+"个月兔子总数为"+fun(n));
}
private static int fun(int n){
if(n==1 || n==2)
   return 1;
else
   return fun(n-1)+fun(n-2);
}
}
初出茅庐,请勿见笑!

作者: 黑马-许泽宇    时间: 2012-6-14 21:50
就是斐波拉契数列嘛,有什么难得...
作者: 刘建龙    时间: 2012-6-14 21:53
黑马-许泽宇 发表于 2012-6-14 21:50
就是斐波拉契数列嘛,有什么难得...

哦!有什么讲解不?是斐波拉切数列啊!有个链接也好啊!我先百度去了
作者: 黑马-许泽宇    时间: 2012-6-14 22:08
就是一个简单的递归算法嘛..你会递归就觉得很简单了,.所以你只需要百度知道递归怎么用就成
作者: 王明明    时间: 2012-6-14 22:22
本帖最后由 王明明 于 2012-6-14 22:40 编辑
  1. public class Prog1{
  2. public static void main(String[] args){
  3. int n = 10;
  4. System.out.println("第"+n+"个月兔子总数为"+fun(n));
  5. }
  6. private static int fun(int n){
  7. if(n==1 || n==2) // 这个地方是判断1月份 跟2月份的 因为1 2月 兔子 都是1对 所以返回1
  8.    return 1;
  9. else
  10.    return fun(n-1)+fun(n-2); //这个地方就是第三月份开始的了 这个得出的数列公式 数学问题
  11. }
  12. }
复制代码
斐波那奖数列:

1,1,2,3,5,8,13,21,34,55,89,144,233,377......


其规律是从第三项起,每一项都是前两项的和.用递推公式表达就是:

a1=a2=1,
an=an+1十an-2(n>=3)
将值带入公式an=an+1十an-2(n>=3)  
con(n) = con(n - 1) + con(n - 2)    (n>=2)
我前不久写的
  1. public class Test
  2. {//用递归法计算兔子的规律
  3. static long fib(int x)
  4. {
  5. if(x>2)
  6. return (fib(x-1)+fib(x-2));
  7. else return 1;
  8. }
  9. public static void main(String[] args)
  10. {
  11. for(int i=1;i<=24;i++)
  12. {
  13. long n=fib(i);
  14. System.out.println("第"+i+"个月有兔子对数为"+n);
  15. }
  16. }
  17. }
复制代码
这个是我以前 百度 看到的这么写 因为当月的兔子等于前两项的和



这是十个月之后的兔子总数
package com.string.to;

public class TuZI {
public static void main(String args[]){
int m=1,n=1,tmpN;//声明3个变量(int类型的 )
for(int month=3;month<=10;month++){
tmpN=n;//让tmpN=n,也就是1
n=m+n;//然后让m和n相加,既n=1+1=2;
m=tmpN;//然后再把tmp的值1付给m,既m=2
} //继续循环
System.out.println(n);

}

}

作者: 王晓新    时间: 2012-6-14 22:25
  1. class Test
  2. {
  3.                 public static void main(String args[])
  4.                 {
  5.                         int [] Fib=new int [13];
  6.                         Fib[0]=1;Fib[1]=1;
  7.                         for(int i=2;i<=12;i++)
  8.                                 Fib[i]=Fib[i-1]+Fib[i-2];
  9.                         for(int i=0;i<=12;i++)
  10.                                 System.out.print(Fib[i]+" ");
  11.                 }
  12. }
复制代码
输出结果:1 1 2 3 5 8 13 21 34 55 89 144 233
作者: 张_涛    时间: 2012-6-14 22:39
首先,必须写出一些数据,从而发现规律进行归纳,这是数学基础,归纳发现并总结规律
数据如表格
我们可以发现:
本月一个月大的兔子=上个月3个及以上大的兔子的个数+上个月2个月大的兔子的个数
本月二个月大的兔子=上个月1个月大的兔子的个数
本月三个月大的兔子=上个月3个及以上大的兔子的个数+上个月2个月大的兔子的个数
观察总数:
可以发现,第三个数据等于前两个数据之和,从而进行编程分析
这种问题要有耐心,画图,锻炼思想,个人比较喜欢,慢慢就熟练了。

fff.png (6.6 KB, 下载次数: 21)

fff.png

作者: 胡大强    时间: 2012-6-14 23:05
public class cc{
public static void main(String[] args){
        int r[]=new int[12];  //创建数组r,表示12个月。。
        r[0]=1;  //表示1月 兔子对数
        r[1]=1;  //表示2月兔子对数
        int len=r.length;
        for(int i=2;i<len;i++){  //第三个月起
                r[i]=r[i-1]+r[i-2];
        }
        for(int i=0;i<len;i++){
                System.out.println("第"+(i+1)+"个月兔子总数为"+r[i]);
        }
}
}

输出结果:
第1个月兔子总数为1
第2个月兔子总数为1
第3个月兔子总数为2
第4个月兔子总数为3
第5个月兔子总数为5
第6个月兔子总数为8
第7个月兔子总数为13
第8个月兔子总数为21
第9个月兔子总数为34
第10个月兔子总数为55
第11个月兔子总数为89
第12个月兔子总数为144




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