Java递归算法——猴子吃桃

      此博文由于笔者的疏忽,内容分析有问题,在此感谢评论区:WINorYU、熙·溯、ZStaoerA等大佬的指出,代码分析中,应该是先+1再乘2,本着记录错误的目的,问题代码就不做删除了,希望各位看此博文的同学以笔者为戒

                                        

     在此为看过这篇博文的同学道个歉,笔者不严谨导致误导了各位同学,以后笔者的博文在发布前,一定反复查验!!!

  

偶然看到一个算法问题——猴子吃桃

题目如下:

.   猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个.第二天早上又将剩下的桃子吃掉一半,又多吃了一个.以后每天早上都吃了前一天剩下的一半零一个.到第十天早上在想吃时,就只剩一个桃子了.求第一天共摘了多少个桃子?

分析:

   设一共有n个桃子,每过一天猴子吃 n/2-1 个桃子,在第十天的时候,n = 1  

   根据递推公式 当第十天n=1时,那么第九天为:1*2+1 = 3,第八天为:3*2+1 = 7 ... 第一天为:n*2+1

 由上诉条件分析我们可以得出程序:

// 问题代码
public static int monkey(int day){

         // 当天数为第十天时,还剩一个桃子
        if (day == 10){
            return 1;
        }

        // 否则根据公式递推 应该是先+1再乘2 此处代码问题未做修复 
        return monkey(day+1)*2+1;

    }



    // 修复代码
    public static int monkey(int day){

        // 当天数为第十天时,还剩一个桃子
        if (day == 10){
            return 1;
        }

        
        return (monkey(day+1)+1)*2;

    }

    

   返回结果:

                                

   通过传入天数1可以得出 第一天猴子共摘了1023个桃子

  由于不确定返回的结果是否正确,笔者写了一个验证程序

    // 定义全局变量 记录天数  问题代码
    private static int day = 0;

    public static int mk(int total){

      System.out.println("第"+(++day)+"天,桃子数量为:"+total);

      // 当桃子为1时,返回的天数是第10天
      if (total== 1){
          return 10;
      }
        
       // 猴子一天会吃前一天剩下桃子总数的一半多一个
      return mk(total/2)-1;
    }

    
   // 修复代码
    public static int mk(int total){

        System.out.println("第"+(++day)+"天,桃子数量为:"+total);

        // 当桃子为1时,返回的天数是第10天
        if (total == 1){
            return 10;
        }

        // 猴子一天会吃前一天剩下桃子总数的一半多一个
        return mk((total/2)-1);
    }

  返回结果如下:

                              

  

                {\__/}                                          {\__/}
                ( ·-·)                                          (·-· )
                / >------------------------------------------------< \
                         |      ☆                            |
                         |         ☆                         |
                         |  ★                                |
                         |         ☆                         |
                         |      ☆                            |
                         |                                   |
                         -------------------------------------

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值