猴子第一天摘下若干个桃子,当天吃了一半,后面又多吃一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。后面每天猴子都吃了前一天剩下的一半零一个。到第十天想再吃时,只剩下一个桃子。求第一天共摘了多少桃子。
输入格式
无。
输出格式
一个整数。
题目及思路分析:
正向(吃桃子顺序)思路:
- 第一天的桃子除二减一得到第二天的桃子数……一直到第九天只剩下一个桃子(题目描述的是“第十天想再去吃的时候”,也就是说第十天没吃,只吃了九天)。
- 数学表达式为:an−1=2an−1
- 已知条件是:a1=1
- 要求的结果:a10
方法实现:
两种实现方法:
- 由于有an与an−1的关系可考虑用递归的方法实现。
- 也可先大致估计数据范围(a10介于1000到5000之间),然后用遍历的方式,寻找满足上述数学关系的数。
代码参考:
递归:
- 可将数学表达式转变成方法二的数学表达式,然后递归,具体代码参见方法二(递归)
反向(加桃子顺序)思路:
- 第二天的桃子是第一天的桃子数加一再总体乘二,一直到第十天(同样只进行九次乘法操作——只吃了九天)
- 数学表达式为:bn=(bn−1+1)×2
- 已知条件是:b1=1
- 要求的结果:a10
实现方法:
- 由于有an与an−1的关系可考虑用递归的方法实现。
- 从a1开始,用递推关系进行九次循环,直接得到结果
代码参考:
递归:
def f(n = 10 ): #默认参数为10,即求a10
if n == 1:
return 1 #当n为1的时候返回
else :
return (f(n-1) +1)*2 #否则调用递归
print(f())
循环:
Sum = 1 #第一天只有一个桃子
for i in range(9): #用9次循环进行加桃子的操作
Sum = (Sum + 1)*2
print(Sum)
或者不用递归,找到等式关系及循环次数直接用循环
#include<stdio.h>
int main(void){
int x;
x=1;
int i;
for(i=9;i>=1;i--){
x=(x+1)*2;
}
printf("%d",x);
return 0;
}