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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© ReadCode 中级黑马   /  2015-5-7 17:36  /  1002 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

首先,我表示,我是来赚技术分的,刚才看到一小伙伴发了个提问,我在这里把我自己写的代码坐下汇总:有错误的,欢迎指正~{:2_32:}
题目:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子对数为多少?
两种解题思路,一种是利用数据变量的值得改变来算兔子,另一种是通过创建数组的方式
方法一:

  1. /*
  2. 整体思路其实就是for循环,第一个月1,第二个月1,第三个月2,第四个月3,第五个月就是5了,可以看出下个月就是前两个月兔子之和
  3. */
  4. class Deno{
  5.         public static void main(String[]args)
  6.         {
  7.                 int m=1;
  8.                 //定义变量,通过在内存中数据的覆值操作,也就是所谓的值传递
  9.                 int n=1;
  10.                 int sum=0;
  11.                 //通过不停的改变内存的变量的值
  12.                 for(int i=1;i<=24;i++)
  13. //for循环,控制i的值,表示的就是月份
  14.                 {
  15.                  
  16.                         n=m;        
  17.                         m=sum;
  18.                         sum=m+n;
  19.                         System.out.println("每个月兔子的数量:"+sum);
  20.                         
  21.                 }
  22.                
  23.                 }
  24.                
  25.         }
复制代码
方法二:


  1. class Demo1{
  2.         public static void main(String[]args)
  3.         {
  4.                 int arr[]=new int [12];
  5.                 //数组中创建12个元素,表示12个月份
  6.                 arr[0]=arr[1]=1;
  7.                 for(int i=0;i<12;i++)
  8.                         //数组中的脚标是从0开始的,注意i的取值范围,避免脚标越界异常
  9.                 {
  10.                         if(i==0||i==1)
  11.                         {
  12.                                 System.out.println("第"+(i+1)+"月的兔子数量:1");
  13. //因为数组的脚标是从0开始的,所以为了相对应的月份就使用的是i+1余数量对应
  14.                         }
  15.                         else
  16.                         {
  17.                                 arr[i]=arr[i-1]+arr[i-2];
  18.                                 System.out.println("第"+(i+1)+"月的兔子数量:"+arr[i]);
  19.                         }
  20.                
  21.                 }

  22.         }
  23. }


复制代码
其实,这个题目可以作为一个衍生例子:比如还有什么蚂蚁爬绳子之类的。



9 个回复

倒序浏览
相似的题目还有这个,不过我这个是用函数的递归解决的。
  1.         /*
  2.         编程求解:若一头小母牛,从出生起第四个年头开始每年生一头母牛,按次规律,第 n 年时有多少头母牛?
  3.         1 1 1 2 3 4 6 9 13 19 28 ... fn=f(n-1)+f(n-3)
  4.         1 2 3 4 5 6 7 8 9
  5.         */


  6.         public static int cow(int n)
  7.         {
  8.                 if (n<=0)
  9.                 {
  10.                         return 0;
  11.                 }
  12.                 else if (n<=3)
  13.                 {
  14.                         return 1;
  15.                 }
  16.                 else
  17.                 {
  18.                         return cow(n-1)+cow(n-3);
  19.                 }
  20.         }
  21. }
复制代码
回复 使用道具 举报
sandra_bae 发表于 2015-5-7 17:40
相似的题目还有这个,不过我这个是用函数的递归解决的。

恩,递归的思想确实看起来简洁容易理解,可以递归好像会在很占内存吧~
回复 使用道具 举报
ReadCode 发表于 2015-5-7 17:46
恩,递归的思想确实看起来简洁容易理解,可以递归好像会在很占内存吧~

嗯,每递归一次,就占用一次栈内存。
不过栈内存被称为效率最高的地方。
回复 使用道具 举报
学习一下
回复 使用道具 举报
sandra_bae 发表于 2015-5-7 18:01
嗯,每递归一次,就占用一次栈内存。
不过栈内存被称为效率最高的地方。 ...

恩,栈内存的效率确实基表高,不像堆内存那样要不断的开辟空间,改变地址值
回复 使用道具 举报
题目有点模棱两可。。以后再研究
回复 使用道具 举报
递归还没学呢
回复 使用道具 举报
这可以使用递归完成!
public void digui(int num){
if(num ==1 ||num ==2){
return 1;
}else{
return digui(num-1)+digui(num-2);
}
}
回复 使用道具 举报
lwj123 发表于 2015-5-7 18:50
这可以使用递归完成!
public void digui(int num){
if(num ==1 ||num ==2){

递归貌似比较耗内存吧~顾忌在项目中会不会用的很少?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马