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年级的孩子讲既是一个难点,又是引领孩子体验编程思想乐趣的机会。以上题目用数学解对孩子难度小些,如能趁机引导他们尝试用编程解,既可以加深数学解法的理解,又可以体会编程解题的妙处。
领取专属 10元无门槛券
私享最新 技术干货