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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 孙百鑫   /  2013-6-15 16:11  /  12470 人查看  /  241 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

两位版主,请教一个问题一下,因为对递归调用这块不是怎么熟悉,就这道题而言,如果用递归的方法,怎么能正确返回最后的值啊,意思就是只打印第一天的值,其它天数的不打印出来,我试了几次都木有能正确返回来,请问你们有木有比较好的方法啊?
  1. /*
  2. 题目:猜一猜猴子摘了多少桃子呢?
  3. 猴子吃桃的问题:猴子第一天摘下来N个桃子,当天就吃了一半,但是还不过瘾,又多吃了一个,第二天早上又将
  4. 剩下的桃子吃了一半,又多吃了一个,以后每天早上都吃了前一天剩下的一半零一个,到第十天早上的时候就发现剩下
  5. 一个桃子了.求第一天一共摘下了多少桃子呢?

  6. 思路:1、此题是一个数学推理题,可以采用逆向思维进行推理,先定义一个方法用表达式表示出第九天的结果;
  7.           2、利用递归原理调用计算方法,这样即可得到计算结果。

  8. 步骤:1、定义一个类,把主函数和计算方法定义在这个类中即可。
  9.           2、定义计算方法及利用递归原理进行调用计算出结果。
  10.           3、定义主函数,调用方法即可得到计算结果。
  11. */
  12. class Demo
  13. {
  14.         public static void jiSuan(int i,int j)//定义计算方法
  15.         {
  16.                 int sum=j;
  17.                 System.out.println("第"+i+"天有"+sum+"个桃子");[color=Red]//这里打印出来的是每天的数值,请问在递归中有什么方法能只打印第一天的数值啊[/color]
  18.                 sum=(sum+1)*2;
  19.                 i--;
  20.                 if(i>0)
  21.                         jiSuan(i,sum);//递归调用
  22.         }       
  23.         public static void main(String[] args)
  24.         {
  25.                 jiSuan(10,1);//调用计算方法
  26.         }
  27. }
复制代码
回复 使用道具 举报
public class Demo {
    public static void main(String[] args) throws Exception {
         //第十天的桃子,做为基数
          int x = 1;

       //变化从九天开始,时间倒流计算
       //第十天是1个,那么在它的基础加多吃一个,再这个基础上还有一半,那么就乘2,就是当天最多的桃子数量
       for (int i = 9; i >0; i--) {
                x=(x+1)*2;   
        //System.out.println(x);
         }
    System.out.println("第一天一共摘了"+x+"个桃子");
    }
}

11.jpg (4.03 KB, 下载次数: 0)

11.jpg

评分

参与人数 1技术分 +2 收起 理由
夜默 + 2 赞一个!

查看全部评分

回复 使用道具 举报
孙柏鑫你什么时候成了版主了
回复 使用道具 举报
class  ChiTaoTest2
{
        public static void main(String[] args)
        {
       
                System.out.println("猴子第一天摘的桃子数是:"+taozi(10));//打印10天前桃子总数
        }
               
        public static int taozi(int days)//定义一个函数求days天前的桃子总数
        {
                int sum;          //定义一个sum接收桃子总数
               
                if(days==1)       //最后一天桃子数是1
                        sum=1;
                else
                        sum=2*(taozi(days-1)+1);  //前一天桃子数是当天桃子数加1后的2倍
                return sum;
        }
               
}

评分

参与人数 1技术分 +3 收起 理由
夜默 + 3

查看全部评分

回复 使用道具 举报
看看题目。。。。
回复 使用道具 举报
  1. /**
  2. 需求:猴子吃桃的问题:猴子第一天摘下来N个桃子,当天就吃了一半,但是还不过瘾,又多吃了一个,第二天早上
  3. 又将剩下的桃子吃了一半,又多吃了一个,以后每天早上都吃了前一天剩下的一半零一个,到第十天早上的时候
  4. 就发现剩下一个桃子了.求第一天一共摘下了多少桃子呢?

  5. 思路:
  6. 从这个文字的描述看,这个系统中包含的对象可以有猴子、桃子、桃子集合,整个系统发生的事情就是猴子
  7. 摘桃子、吃桃子,最后需要知道猴子第一天摘了多少桃子。如果把这个系统用计算机描述出来,并模拟系统
  8. 的运行,是可以知道猴子第一条摘多少桃子的。因为开始不知道猴子摘了多少桃子,所以只能逆着模拟系统
  9. 的正常情况来模拟运行。


  10. 步骤:
  11. 1.系统要运行需要桃子仓库,用来保存桃子,桃子仓库用可以动态增删元素的集合来表示
  12. 2.还需要猴子,猴子要有吃桃子的行为,由于是逆着模拟系统,所以根据当天剩余的桃子数量可以计算出当
  13. 天猴子吃掉的桃子,然后把猴子吃掉的保存进桃子仓库,这样就得到了上一天的仓库的桃子剩余数量,一直
  14. 递归调用猴子吃桃,直到 10 天前
  15. 3.把猴子吃掉10天后桃子仓库的数量打印出来就是猴子摘的桃子的总量
  16. */
  17. import java.util.*;

  18. class MonkeyAndPeachMain
  19. {
  20.     public static void main(String[] args)
  21.     {
  22.         LinkedList<Peach> peachStorage = new LinkedList<Peach>();
  23.         Monkey monkey = new Monkey();

  24.         peachStorage.add(new Peach());  //因为最后一天还剩一个桃,所以先把仓库里面放一个桃子
  25.         monkey.eatPeach(peachStorage, 1);

  26.         System.out.println("猴子总共摘了 " + peachStorage.size() + " 个桃子");
  27.     }
  28. }

  29. class Monkey
  30. {
  31.     /**
  32.      * @param peachStorage  桃子仓库
  33.      * @param day           猴子吃桃的天数
  34.      */
  35.     public void eatPeach(LinkedList<Peach> peachStorage, int day)
  36.     {
  37.         if(day >= 10)
  38.         {
  39.             return;
  40.         }
  41.         else
  42.         {
  43.             int currentPeachAcount = 0;
  44.             int peachStorageSize = peachStorage.size();
  45.             while(currentPeachAcount < (2*(peachStorageSize+1)-peachStorageSize))
  46.             {
  47.                 peachStorage.add(new Peach());
  48.                 currentPeachAcount++;
  49.             }
  50.             eatPeach(peachStorage, day+1);
  51.         }
  52.     }
  53. }

  54. class Peach
  55. {
  56. }
复制代码
实在调不好这个代码的缩进,我勒个去。


评分

参与人数 1技术分 +3 收起 理由
夜默 + 3 很给力!

查看全部评分

回复 使用道具 举报
mulua 中级黑马 2013-6-15 20:15:04
87#
好活动    多多举办
回复 使用道具 举报
不知道楼主说的正向思维是什么意思,难道要一个一个的数测试?

点评

从第一天考虑 要解释清楚  发表于 2013-6-15 20:52
回复 使用道具 举报
class cx3
{

public static void main(String[] args) {
  int x=10;
  int sl=Sl(x);
     System.out.println("第一天总共摘了"+sl+"个桃子,真能摘!");
}
public  static int Sl(int n)
     {
      int x;// 第一天总共摘的。
      if(n==1)//最后一天
       x=1;
      else
       x=2*(Sl(n-1)+1);//前一天的桃子数目等于后一天数量加1乘2
      return x;
     }
}

QQ图片20130615202458.jpg (7.39 KB, 下载次数: 0)

QQ图片20130615202458.jpg

评分

参与人数 1技术分 +3 收起 理由
夜默 + 3 很给力!

查看全部评分

回复 使用道具 举报 1 0
好的,让我来瞧瞧
回复 使用道具 举报
上次做粽子题上瘾了
回复 使用道具 举报
class Test
{
        public static void main(String[] args) {
                System.out.println(taozi(10));
        }
        public  static int taozi(int t)   //参数为天数
        {
                        int g =0;//个数
                        if(t==1) //最后一天
                         g=1;  
                        else
                         g=2*(taozi(t-1)+1);/*递归调用天数逐次减少*/
                        return g;  //返回桃子个数
        }
}

评分

参与人数 1技术分 +3 收起 理由
夜默 + 3

查看全部评分

回复 使用道具 举报
class ZhuanFen
{
public static void main(String[] args)
{
  
  int count = 1;//最后一天剩下的桃子数,并用它来当计数器记录前一天的桃子数
  
  for (int x=0;x<9 ;x++ )//因为是第十天早上发现桃子只有一个 所以第九天早上吃完后就剩1个桃子了,所以要循环9次。
  {
   count = (count+1)*2;//计算前一天的桃子数,并用计数器记录
  }
  System.out.println(count);
  
}
}

之前循环次数数错了,小于9才是循环9次,嘿嘿

评分

参与人数 1技术分 +3 收起 理由
夜默 + 3

查看全部评分

回复 使用道具 举报
来得分 亲爱的鑫鑫。哈
回复 使用道具 举报
啥情况
!!!
回复 使用道具 举报
新手试试看能做出来不
回复 使用道具 举报
package learningtest;

/*
猴子吃桃的问题:猴子第一天摘下来N个桃子,当天就吃了一半,但是还不过瘾,又多吃了一个,第二天早上又将
剩下的桃子吃了一半,又多吃了一个,以后每天早上都吃了前一天剩下的一半零一个,到第十天早上的时候就发现剩下
一个桃子了.求第一天一共摘下了多少桃子呢?
*/
public class Joker {

        public static void main(String[] args) {
                System.out.println(Mokey.getPeach(1));
        }

}

class Mokey {
       
        public static int getPeach(int day) {
                int sum = 0;
                if(day == 10) {
                        sum = 1;
                } else if(day < 10) {
                        sum=2*(getPeach(day+1)+1);  
                }
                return sum;
        }
       
}

评分

参与人数 1技术分 +2 收起 理由
夜默 + 2 写注释,是一个好习惯..

查看全部评分

回复 使用道具 举报
先下来看看到底是啥题
回复 使用道具 举报
  1. package com.itheima.reflect;

  2. public class TestDemo {

  3.         public static void main(String[] args) {
  4.                 //分析题可知。
  5.                 int n = method(1);//第九天剩下的桃子
  6.                 for(int i=0;i<8;i++){
  7.                         n = method(n);//利用循环求出总数
  8.                 }
  9.                 System.out.println(n);
  10.         }
  11.         public static int method(int x){
  12.                 return (x+1)*2;
  13.         }
  14. }
复制代码
c:\Users\Win7\Desktop\捕获.PNG

评分

参与人数 1技术分 +2 收起 理由
夜默 + 2 很给力!

查看全部评分

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