Java遞歸算法——猴子喫桃

偶然看到一個算法問題——猴子喫桃

    發現網上很多相關文章或多或少都有一定的問題,爲了避免誤人子弟,筆者利用閒暇時間寫了此篇文章

題目如下:

.   猴子第一天摘下若干個桃子,當即吃了一半,還不過癮,又多吃了一個.第二天早上又將剩下的桃子喫掉一半,又多吃了一個.以後每天早上都吃了前一天剩下的一半零一個.到第十天早上在想喫時,就只剩一個桃子了.求第一天共摘了多少個桃子?

分析:

   設一共有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;
        }

        // 否則根據公式遞推
        return monkey(day+1)*2+1;

    }

   返回結果:

                                

   通過傳入天數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;
    }

  返回結果如下:

                              

  

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章