猴子吃桃问题(三种方法解决)

题目:猴子第一天摘了若干个桃子,当即吃了一半,还不解馋,又多吃了一个;第二天,吃剩下的桃子的一半,还不过瘾,又多吃了一个;以后每天都吃前一天剩下的一半多一个,到第10天想再吃时,只剩下一个桃子了。问第一天共摘了多少个桃子?

———-

一、思路分析:
采用逆向思维,从后往前推断,发现其中有相同的地方,即出现递推公式,可以采用递归方法。
令S10=1,容易看出S9=2(S10+1),简化一下
S9=2S10+2
S8=2S9+2
…..
Sn=2Sn+1+2
下面我将采用三种方式解决这个问题。(前两种为普通循环方式,第三种为递归方式)

二、代码讲解

1、方法一(while语句)

我以while语句为例,do while等也可以实现,留给读者自己思考、修改

//方法一:
//  Created by Neil Wesley on 16/5/23.
//  Copyright © 2016年 Neil Wesley. All rights reserved.

#include<stdio.h>
int main()
{
    int day=9,x1=0,x2=1;
    while (day>0)
    {
        x1=(x2+1)*2;
        x2=x1;
        day--;
    }
    printf("The first day of picking peaches number is:%d\n",x1);
}

2、方法二(for循环)

//方法二:
//  Created by Neil Wesley on 16/5/23.
//  Copyright © 2016年 Neil Wesley. All rights reserved.

#include<stdio.h>
int main()
{
    int day=9,x1=0,x2=1;
    for(;day>0;day--)
    {
        x1=(x2+1)*2;
        x2=x1;
    }
    printf("The first day of picking peaches number is:%d\n",x1);
}

3、方法三(递归方法)

方法三:
//  Created by Neil Wesley on 16/5/23.
//  Copyright © 2016年 Neil Wesley. All rights reserved.

#include "stdio.h"
int sumPeach(int day)
{
    if (day == 10)
        return 1;
    else
    return 2 * sumPeach(day + 1) + 2;
}
int main()
{
    int sum;
    sum=sumPeach(1);
    printf("The first day of picking peaches number is:%d\n",sum);
}

三、运行结果

以上三种方法的运行结果都是:

运行结果

### 猴子问题递归算法解析 #### 问题描述 小猴子第一天摘下若干个桃子,当即一半并额外一个。之后每一天都会重复这一过程直到第 n 天只剩下最后一个桃子。目标是计算第一天少个桃子。 #### 解题思路 采用逆向思维来解决这个问题更为简单有效。从最后一天反推回第一天的情况可以简化逻辑处理。假设已知某天剩余 m 个桃子,则前一天的数量应为 (m + 1) * 2 。基于此规律构建递归函数 `Peach(day)` 来表示当天所剩桃子数目,并利用递归来逐步返回至初始状态即第一天的总数目[^2]。 #### Python 实现代码 ```python def peach(day): if day == 1: return 1 else: return (peach(day - 1) + 1) * 2 ``` 上述代码定义了一个名为`peach()` 的递归函数用于解决问题。当参数`day`等于1时直接返回1代表最终仅存的一个桃子;否则按照公式`(前一日数量+1)*2` 计算当前日应有的桃子数并通过调用自身完成迭代运算直至达到起始条件为止[^3]。 #### C++ 实现代码 对于C/C++环境下的实现方式如下所示: ```cpp #include <iostream> using namespace std; int Peach(int day); int main(){ int n; cin >> n; // 输入总天数 cout << "The first day had " << Peach(n) << " peaches." << endl; } // 定义递归函数 int Peach(int day){ if(day==1)return 1; else{ return ((Peach(day-1)+1)*2); } } ``` 这段程序同样遵循了相同的递归策略,在主函数中接收用户输入的天数值后调用了自定义的递归方法`Peach()` 并打印出结果信息[^5]。
评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值