偶然看到一個算法問題——猴子喫桃
發現網上很多相關文章或多或少都有一定的問題,爲了避免誤人子弟,筆者利用閒暇時間寫了此篇文章
題目如下:
. 猴子第一天摘下若干個桃子,當即吃了一半,還不過癮,又多吃了一個.第二天早上又將剩下的桃子喫掉一半,又多吃了一個.以後每天早上都吃了前一天剩下的一半零一個.到第十天早上在想喫時,就只剩一個桃子了.求第一天共摘了多少個桃子?
分析:
設一共有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;
}
返回結果如下:
{\__/} {\__/}
( ·-·) (·-· )
/ >------------------------------------------------< \
| ☆ |
| ☆ |
| ★ |
| ☆ |
| ☆ |
| |
-------------------------------------