源本科技 | 码上会

猴子吃桃问题

2026/01/26
19
0

题目

猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第 10 天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。

说明

这是一个经典的逆向递推问题。题目描述了猴子每天吃桃的规律:每天吃掉前一天剩余桃子的一半再加一个。已知第 10 天早上只剩 1 个桃子,要求反推出第 1 天摘了多少桃子。

由于正向计算需要未知初始值,而逆向推理可以从已知的第 10 天状态(1 个桃子)出发,逐日倒推前一天的桃子数量。

设第nn 天早上的桃子数为ana_n,则根据题意有:an=an121 a_{n} = \frac{a_{n-1}}{2} - 1 变形可得逆推公式:an1=(an+1)×2a_{n-1} = (a_n + 1) \times 2

从第 10 天(a10=1a_{10} = 1)开始,连续逆推 9 次即可得到第 1 天的桃子总数a1a_1

运行示例

第一天共摘1534

👈点击左箭头查看答案(一定要在自己思考并实现后再看参考答案哦!)

规律分析

  • 第 10 天早上:1 个

  • 第 9 天早上:(1+1)×2=4(1 + 1) \times 2 = 4

  • 第 8 天早上:(4+1)×2=10(4 + 1) \times 2 = 10

  • 第 7 天早上:(10+1)×2=22(10 + 1) \times 2 = 22

  • 每次逆推都是对当前数量加 1 后再乘以 2

  • 共需逆推 9 次(从第 10 天回到第 1 天)

该过程体现了逆向思维在算法设计中的巧妙应用:当正向逻辑依赖未知初值时,从已知终态反推往往更高效简洁。

程序实现

public class Demo17 {
    public static void main(String[] args) {
        int sum = 1; // 第10天早上的桃子数
        for (int i = 0; i < 9; i++) { // 从第10天倒推到第1天,共9步
            sum = (sum + 1) * 2;
        }
        System.out.println("第一天共摘" + sum);
    }
}

补充说明

“猴子吃桃问题”是中国小学奥数和编程入门中常见的递推 / 递归类题目,强调逆向思维的重要性。

类似的问题还有“井底之蛙爬井”、“银行复利倒算本金”等。