好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

猴子吃桃问题

猴子吃桃问题

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

分析:

到第10天早上想吃时只剩下一个桃子,那在第9天吃完后就只剩下一个桃子了,第10天并没有吃桃子,即只有9次循环,不是10次

 第10天        共有1个桃子
第9天     设第9天共有x个桃子,那 x/2 - 1 = 1,即x=2(1+1),即x=2(第10天桃子数 + 1),所以,当天的桃子数=2(后一天桃子数+1)
... 

代码:

 cur = 1  # 第9天吃完后为1
for _ in range(9, 0, -1):
    pre = 2*(cur + 1) # 前一天桃子数的公式
    cur = pre  # cur要指向刚计算出的当天值,一轮轮的循环计算,最后到第一天
print(cur)
# 1534 

另一种方法,对上边代码的变形

 x = 1  # 最后一天的桃子数
for _ in range(9, 0, -1):
    x = 2*(x + 1)  # = 号后右边先计算再赋值给x,循环9次后也能得到第一天的桃子数
print(x) 

递归实现

当天桃子数=2*前一天桃子数 + 2,到第9天吃完桃子时就只剩下1个。

方法一:

 def peach(day=9, nums=1):
    nums = 2*nums + 2  # 前一天桃子数
    day -= 1
    if day == 0:
        return nums
    return peach(day, nums)

print(peach())
# 一共进行了9次嵌套 

方法二:

 def peach(day=9):
    if day == 0:
        return 1
    return 2*peach(day - 1) + 2

print(peach()) 

查看更多关于猴子吃桃问题的详细内容...

  阅读:29次