有趣的桃子和桃核问题

官方(厦门市教育局-科协)举办的2023年小学生LOGO语言编程竞赛中有这样一道有趣的填空题:“假设一元钱能够买一个桃子,且三个桃核能跟商家换回一个桃子。请问:给你10元钱,你最多能吃到
【21】
个桃子?”说这道题目有趣,首先是“商家”是否真的会回收人家吃过桃子被作为废物丢弃的桃核?回收桃核这事还真的存在。经挑选、清洁、处理过的桃核是“微雕”的好材料。一个成品桃核微雕的价值可能远远超过单个水果桃子的价格的百倍、千倍以上。从桃核中取出的“桃仁”更是一味重要的中药材。所以“回收桃核”是真的有这回事的(但实际操作中更可能是大批量地回收,而不是几个几个地回收)。
从另外一个角度来思考,说这道题目“有趣”,是解算“最多能吃到几个桃子”的过程,其实是一个“递归”计算过程。就以题目规定的“给你10元钱”,正确的思考过程应该是这样子的:
一开始有 10 元钱,买来桃子 10
个。
这一轮桃核能够换桃子 3 个。累计桃子数 13
个。
这一轮桃核能够换桃子 1 个。累计桃子 14
个。
剩下的桃核已经换不了桃子了。
所以最多能吃到 14
个桃子。
在这个递归过程中,你一直在根据“三个桃核能跟商家换回一个桃子”的规则进行“递归判断”运算。比如10个桃核当然就只能换3个桃子(剩余的1个桃核不足3个换不了)。在开始只有10元钱的情况下,递归的层次有限(对桃核的数量经过了3轮计算),可以很快地计算出来。但是在一开始时桃子数较多的时候,用上述的“列表法”就会显得“力不从心”了。把这样的思考过程编写成程序是这样子的:
to taoh :n :g
;桃核换桃子递归程序
(pr "现有桃子 :n "个 "累计桃子 :g
"个)
if :n<3[ (pr "最多能吃到 :g "个桃子)
stop]
make "n int(:n/3)
;执行3个桃核换1个桃子的运算
make "g :g+:n
;用桃核换得到的桃子数需要累加到桃子的总数里面的
taoh :n :g
;递归,继续进行桃核换桃子的操作
end
在求解10元买桃子的情况下,应输入: taoh 10 10
。
前面的:n=10是指因为有10元钱,所以相当于“现有10个桃子”;
后面的:g=10是指“当前桃子的累计数是10个”。
make "n int(:n/3)
是执行3个桃核换1个桃子的运算。
make "g
:g+:n是指用桃核换得到的桃子数需要累加到桃子的总数里面的。
如此递归计算,不论一开始有多少“钱”,最终能够“吃”到多少个桃子很快就会计算出来。
下面是计算实例:
taoh 10 10
现有桃子 10 个 累计桃子 10
个
现有桃子 3 个 累计桃子 13 个
现有桃子 1 个 累计桃子 14 个
最多能吃到 14 个桃子
taoh 100 100
现有桃子 100 个 累计桃子 100
个
现有桃子 33 个 累计桃子 133
个
现有桃子 11 个 累计桃子 144
个
现有桃子 3 个 累计桃子 147
个
现有桃子 1 个 累计桃子 148
个
最多能吃到 148 个桃子
taoh 3000 3000
现有桃子 3000 个 累计桃子 3000
个
现有桃子 1000 个 累计桃子 4000
个
现有桃子 333 个 累计桃子 4333
个
现有桃子 111 个 累计桃子 4444
个
现有桃子 37 个 累计桃子 4481
个
现有桃子 12 个 累计桃子 4493
个
现有桃子 4 个 累计桃子 4497
个
现有桃子 1 个 累计桃子 4498
个
最多能吃到 4498 个桃子
即使是一开始有多达3000元,也只要递归8个层次也就能计算出结果来。
在历届计算机程序设计竞赛中经常都有类似的“趣味数学”、“动脑筋”题目。从上面的解析我们能够清楚地看到:这些“趣味数学”、“动脑筋”题目的思维方式和编程是完全相通的。所以计算机程序设计竞赛考试“趣味数学”、“动脑筋”题目也是顺理成章的事情。考试过后将这一类题目编写成程序,更是深入学编程的好方法。
加载中,请稍候......