通过Scratch解决了一个古代数学问题,其实这是编程中一个非常典型的递归算法。
“递归算法,好难的样子,什么叫递归算法呢?”
递归算法
递归算法(英语:recursion algorithm)在计算机科学中是指一种通过重复将问题分解为同类的子问题而解决问题的方法。
是不是还是不能理解?没关系,后面我们会有更多的练习来学习递归算法。
猴子吃桃
核心知识点:递归算法
今天我们解决一个猴子吃桃的问题,通过上次课的学习,这个问题会变的非常简单,题目如下:
一群猴子去山上摘了很多桃子回家,它们将桃子放到了仓库中,第一天它们吃掉了摘回来桃子的一半,但是有一只贪吃的小猴子在大家吃完桃子离开后又偷偷吃掉一只,第二天它们又来到仓库,吃掉了剩下桃子的一半,那只贪吃的猴子又偷偷吃掉了一只,就这样它们每天都会吃掉前一天剩下的一半,那只贪吃的小猴子总是再多吃掉一只,等他们第十天到仓库的时候,发现仓库中只剩下了1只桃子,那么请问:第一天它们一共摘回来多少只桃子呢?
问题分析:
首先我们仍然可以通过方程式求解,如我们设第一天它们摘回来x只桃子,那么第一天吃完后就会剩下:x÷2-1只,第二天吃完后就会剩下(x÷2-1)÷2-1只… …然后当第九天吃完后,桃子数量变成了1只,通过方程式求解我们可以计算出第一天的桃子数量。
“好麻烦呀,上次课是4次已经很麻烦了,这次是10次,我要用编程来算!”
体验递归算法
像上次课一样,我们仍然采用逆向思维,从最后一天向前来进行计算,第10天它们到仓库的时候仓库中剩下了1个桃子,第9天它们到仓库的时候仓库中剩下(1+1)2只桃子(因为猴子们吃掉一半后,贪吃的小猴子又吃掉了一只桃子,所以我们需要把偷吃的那一只桃子补上,再通过2来把猴子们吃掉的一半补上)…… 这样我们通过计算,可以算出第1天仓库中桃子的最初数量。
那么如何通过Scratch实现呢?相信聪明的小朋友已经找到了解决办法!
我们设定桃子的数量为变量n,最终我们所需要求出的就是第一天仓库中桃子的初始数量(我们就叫它n1),那么假设第10天它们到仓库中时桃子数量为n10,那么n10=1,第9天它们到仓库中时桃子数量就是:
n9=(n10+1)*2;
n8=(n9+1)*2;
n7=(n8+1)*2
… …
我们按照这样的规律计算了9次后会得到n1的数值(想想看,为什么不是10次而是9次?)
最后我们计算出了第一天它们一共摘回来1534个桃子。
“这么多桃子,这个结果对不对呢?”
那么我们用笨办法来计算下,看看我们的结果对不对。
第10天:1
第9天:(1+1)*2=4
第8天:(4+1)*2=10
第7天:(10+1)*2=22
第6天:(22+1)*2=46
第5天:(46+1)*2=94
第4天:(94+1)*2=190
第3天:(190+1)*2=382
第2天:(382+1)*2=766
第1天:(766+1)*2=1534
完全正确!是不是通过编程来求解更便捷?