问题:
一只猴子第1天摘下若干桃子,当天即吃了一半,但还不过瘾,又多吃了m个;第2天早上又将剩下的桃子吃掉一半后,又多吃了m个;以后每天都是如此,到第10天早上再吃时,见只剩下一个桃子了。求猴子第1天共摘下了多少个桃子?
解析:
第1天吃去的桃子数是第2天桃子数加m后的2倍,第2天吃去的桃子数是第3天桃子数加m后的2倍,...,第k天吃去的桃子数是第k+1天加m后的2倍。
这是一个典型的递推问题。
解法一:逆向递推法
由题可得,
第10天时剩余桃子1个
设第八天剩余桃子x个,则第九天吃了(x/2+m)个,剩余 x-(x/2+m)个
即x-(x/2+m)=1,求得x=2*(m+1)
以此类推,每天剩余的桃子数都是后一天桃子数+m后的2倍,由此可写出代码:
'''逆向递推'''
def monkey_eat_peach(m):
peaches = 1 #设初始值为1,即第十天剩1个桃子
for i in range(9): #逆推进行9次循环
peaches = 2*(peaches+m) #每天的桃子数都为后一天桃子数+m后的两倍
return peaches #返回值为第一天的桃子数
result=monkey_eat_peach(1) #假设猴子每次多吃一个桃子
print(result)
输出结果如下:
解法二:正向模拟法
'''正向模拟法'''
def verify_peaches(initial_peaches, m):
remaining = initial_peaches
for day in range(1, 10): # 模拟前9天
eaten = remaining / 2 + m
remaining -= eaten
# 确保桃子数足够吃(题目隐含条件)
if remaining < 0:
return False
return round(remaining) == 1 # 第10天早上应剩1个
# 示例:验证当m=1时,1534个桃子是否满足条件
initial = 1534
print(f"验证结果:{verify_peaches(initial, 1)}") # 应输出True
输出结果如下:
有问题请留言
欢迎大佬指出问题与不足