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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘建龙 初级黑马   /  2012-6-14 21:46  /  2009 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 刘建龙 于 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);
}
}
初出茅庐,请勿见笑!

评分

参与人数 1技术分 +1 收起 理由
赵志勇 + 1 赞一个!

查看全部评分

7 个回复

倒序浏览

回帖奖励 +1

就是斐波拉契数列嘛,有什么难得...
回复 使用道具 举报
黑马-许泽宇 发表于 2012-6-14 21:50
就是斐波拉契数列嘛,有什么难得...

哦!有什么讲解不?是斐波拉切数列啊!有个链接也好啊!我先百度去了
回复 使用道具 举报
就是一个简单的递归算法嘛..你会递归就觉得很简单了,.所以你只需要百度知道递归怎么用就成
回复 使用道具 举报
本帖最后由 王明明 于 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);

}

}

评分

参与人数 1技术分 +1 收起 理由
赵志勇 + 1 很给力!

查看全部评分

回复 使用道具 举报
  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:58
7#
首先,必须写出一些数据,从而发现规律进行归纳,这是数学基础,归纳发现并总结规律
数据如表格
我们可以发现:
本月一个月大的兔子=上个月3个及以上大的兔子的个数+上个月2个月大的兔子的个数
本月二个月大的兔子=上个月1个月大的兔子的个数
本月三个月大的兔子=上个月3个及以上大的兔子的个数+上个月2个月大的兔子的个数
观察总数:
可以发现,第三个数据等于前两个数据之和,从而进行编程分析
这种问题要有耐心,画图,锻炼思想,个人比较喜欢,慢慢就熟练了。

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

fff.png

评分

参与人数 1技术分 +1 收起 理由
赵志勇 + 1 赞一个!

查看全部评分

回复 使用道具 举报
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

评分

参与人数 1技术分 +1 收起 理由
赵志勇 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马