首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

经典题目:5猴分桃

1979年,李政道博士给中国科技大学少年班出过一道知趣题:5只猴子分一堆桃子,怎么也分不成5等分,只好先去睡觉,准备第二天分。夜里1只猴子偷偷爬起来,先吃掉一个桃子,然后将其分为5等份,藏起自己的一份就去睡觉了;第二只猴子又爬起来,吃掉一个桃子后,也将桃子分成5等份,藏起自己的一份睡觉去了;以后的3只猴子都先后照此办理。

问最初有多少个桃子?

def consume(count, num):

if count == 0:

return 1

elif (num - 1) % 5 != 0:

return -1

num = (num - 1) * 4 / 5

return consume(count - 1, num)

count=5

num=1

while num

num+=1

result=consume(count,num)

if result == 1:

print(num)

输出output:

1

3121

6246

9371

# 10000以内有三个符合题目的结果,当然,如果原题再加一句话,符合要求最少的桃子数量是多少?那么就有唯一解:3121

难点一:引入计数器

共有5次判断,每次都是判断剩下的桃子数量减一后是否可以除尽5?

办法是引入count作为计数器,满足以上条件一次则count-1,直至count=0;

如果中间有无法除尽的情况(num - 1) % 5 != 0,则程序跳出判断,返回-1值

难点二:递归

需要思考每次猴子连吃带拿,剩下的桃子数量变动是否符合递归?

每一次分配桃子都有共同的地方:减去1,再除以5,可以除尽

符合递归的特征:

描述第count次分桃子和第count-1次分桃子,桃子数量num之间存在以下联系

num = (num - 1) * 4 / 5

只有当if判断num能整除5,则输出下一个猴子分桃时看到的桃子数量

return consume(count - 1, num)

递归的概念对小学6年级的孩子讲既是一个难点,又是引领孩子体验编程思想乐趣的机会。以上题目用数学解对孩子难度小些,如能趁机引导他们尝试用编程解,既可以加深数学解法的理解,又可以体会编程解题的妙处。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180601G21NJ400?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券