Python一行代码解决“猴子吃桃”问题

5 篇文章 0 订阅
4 篇文章 0 订阅

题目原题

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

数学推导

“猴子吃桃”问题本质上是一个与数列有关的问题,我们可以通过数学归纳法得出计算n天前桃子个数的通项公式。

得到计算n天前桃子个数的通项公式,如下

a{_{n}}^{}=2_{}^{n+1}c+2\cdot 2_{}^{n-1}-2

完整代码

是的,你没有看错!仅有一行代码!

print((lambda remain, days: (remain + 2) * (2 ** (days - 1)) - 2)(1, 10))

何不循环

另一种以函数和循环的实现方式如下:

def peach_amount(remain, days):
    for i in range(days - 1):
        remain = 2 + remain * 2
    return remain


print(peach_amount(1, 10))

当吃桃天数不再是10,而是推广至一个很大的正整数时,通过循环计算,将会很慢,这一点我们可以通过计量各个算法的运行时间看出:

from timeit import timeit


def peach_amount(remain, days):
    for i in range(days - 1):
        remain = 2 + remain * 2
    return remain


times = 500_000

print(timeit("peach_amount(1, times)", globals=globals(), number=1))

print(timeit("(lambda remain, days: (remain + 2) * (2 ** (days - 1)) - 2)(1, times)", globals=globals(), number=1))

高下立判的速度差距。

运行结果

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值