如今生活如此便利,遇到不懂的事情百度一下,部分小伙伴还可以Google一下,会出来很多相关搜索的信息和数据。作为程序员,如果有孩子或者其他的小朋友问你关于搜索中的原理,你该怎么向他们解释?
解释太难,孩子可能听不懂,解释太简单,又把握不住简单的度。唉,不禁感叹做程序员长辈好难。不如试试下面这种解释,以现在少儿编程中很火的编程工具Scratch为例。
还不太了解Scratch?可能在成年人中不太流行,但在学校和少儿编程中知名度可与Python相比。如果你已经很熟悉了,请跳过这段介绍。
Scratch是麻省理工媒体实验室终身幼稚园组开发的一套计算机程序开发平台,旨在让程序设计语言初学者不需先学习语言语法便能设计产品。开发者期望通过学习Scratch,启发和激励用户在愉快的环境下经由操作(如设计交互故事)去学习程序设计、数学和计算知识,同时获得创造性的思考,逻辑编程,和协同工作的体验。
在Scratch中,“角色”是通过名为“脚本”的程序来操纵的。我们来看一个让角色边动边发出声音的脚本吧。点击绿旗图标或脚本本身,就可以看到角色随着鼓声动起来了。
脚本
角色
Scratch 就是像上面这样把这些有颜色的“模块”排列起来制作脚本的。
如果仔细看这些模块上写的字,就可以知道程序向角色发出了什么样的指令。
这些模块和玩具积木非常像,对吧?
回到正题,我们该怎么向小朋友解释搜索中的原理?需要用理论结合实践,输入Scratch,搜索网站便会在大量数据中查找Scratch相关数据。
如上图所示,搜索指的就是在数组中找出符合某个条件或性质的数据。它是通过搜索算法实现的,下面我们就介绍两种最具代表性的搜索算法:线性搜索和二分搜索。
线性搜索
线性搜索就是在给出的数组中, 按顺序逐个比较每一项,从而找到所需数据。下面通过具体实例(下列数组中搜索15)逐步学习线性搜索。
该数组中有7个数据,首先与第一位数据17进行比较,与我们要搜索的数据15不同,因此移动到下一步。
第二位数据是2,也与15不同,因此移动到下一步。
第三位数据是20,也与15不同,因此移动到下一步。
第四位数据是15,正是要搜索的数据,因此搜索成功,操作结束。
如果7个数据全部比较完毕也没有找到所需数据,则表示搜索失败。
线性搜索算法
建立列表data,并设为任意数。
建立变量key,代表要搜索的数据。
建立变量a,并设为1。
如果a大于列表data的项目数,则移动到步骤7 。
如果key与data的第a项相同,则输出“搜索成功”并完成操作。
将a加1,并移动步骤4 。
输出“搜索失败”并完成操作。
下面我们通过在 17, 8, 20, 15 这个数组中搜索20,来进一步了解算法的运行过程。
1. 将列表 data 设为 17、8、20、15。将变量 key 设为 20。将变量 a 设为 1。
2. a 不大于 data 的项目数(4),将 key 的值与第一位数据 17 进行比较,两者不同,因此移动到下一步。
3. 将 a 的值加 1,a(=2)不大于 data 的项目数(=4),将 key 的值与第二位数据 8 进行比较,两者不同,并移动到下一步 。
4. 将 a 的值加 1,a(=3)不大于 data 的项目数(=4),将 key 的值与第三位数据 20 进行比较,两者相同。输出“搜索成功”并完成操作。
编写程序
理解了线性搜索的算法,我们怎么用编程实现? 下面就来用 Scrach 编写程序。
1. 建立列表 name 和 age,删除其全部项,并将 7 名学生的姓名和年龄分别添加到列表 name 和 age。
2. 建立变量 key,并设为输入的学生姓名。
3. 建立变量 a,设为 1。添加
4. 如果在列表name中找到key,则由Scratch小猫说出相应的学生姓名和年龄,并终止程序。那么绿框 1 处应该填写什么内容?
5. 将 a 的值加 1,并继续重复执行。
6.如果在列表 name 中没能找到 key,则由 Scratch 小猫说出“没有”。程序创建完成。
7.此程序运行结果如下。
二分搜索
二分搜索指的是,在一个有序列表中,通过逐渐缩小搜索范围进行搜索。下面通过具体实例来认识这一方法。
在下面的升序排列数组中,使用二分搜索找到数据 15。我们逐步展开。
1. 该数组共有 7 个数据,将首项和末项的位置数(即 1 和 7)分别设为 low 和 high。
2. 还需要计算数组的中间位数。使用下面的数式可以计算出中间位数为 4,将其设为mid。
mid 位,即第 4 位的数据是11,将其与15 进行比较。
3. 15 大于 11,因此 mid 位右侧的数据成为新的搜索范围。计算可知,新范围中的low 位(即 mid+1)是第 5 位。
4. 再次计算 mid 位是第 6 位。因此将第 mid 位的数据(=17)与 15 进行比较。
5. 15 小于17,因此将当前 mid 位左侧的数据重新设为新的搜索范围。需要重新计算新范围中的 high 位,即 mid-1=5。新的 high 位就是第 5 位。
6. 再次计算 mid 位是第 5 位。因此将第 mid 位的数据(=15)与15进行比较,
两者相同,搜索结束。
如果 low 大于 high,则不能找到所求数据,搜索失败。
二分搜索算法
建立列表 data,并将有序排列的任意数据添加到该列表。
建立变量 key,设为要搜索的数据。
建立变量 low,设为 1 ;变量 high,设为列表 data 的项目数。
如果 low 大于 high,则移动到步骤 8 。
建立变量 mid,设为 (low + high ) / 2。
如果 key 与列表 data 的第 mid 项相同,则输出“搜索成功”,操作完成。
如果 key 小于列表 data 的第 mid 项,则将 high 设为 mid-1,并移动到 步骤 4 ;否则将 low 设为 mid+1,并移动到步骤 4 。
输出“搜索失败”,操作完成。
下面在数组 8、10、13、15、20 中搜索 15,借此实例了解算法的运行过程。
1. 将 8、10、13、15、20 添加到列表 data。 将变量 key 设为 15。分别将变量 low和 high 设为 1 和 5,low 不大于 high,因此移动到下一步。
2. 将变量 mid 设为(low+high)/2(=3)。
3. key 大于列表 data 的第 mid 项(=13),因此将 low 设为 mid+1(=4),low(=4)不大于 high,因此移动到下一步。
4. 将变量 mid 设为(low+high)/2(=4)(设为向下取整)。
5. key 与列表 data 的第 mid 项(=15)相同,因此输出“搜索成功”,完成操作。
编写程序
1. 建立列表 name 和 age,删除其全部项,并将 7 名学生的姓名(按部首笔画递增排序)和相应年龄分别添加到列表 name 和 age。
2. 建立变量 key,设为要搜索的数据。建立变量 low,设为 1;建立变量 high,设为列表 name 的项目数。
3. 添加
4. 如果 key 与列表 name 的第 mid 项相同,则说出相应学生的姓名和年龄,程序停止。
6. 如果 key 与列表 name 的第 mid 项不同,则变更 low 或者 high 的值,继续重复执行。那么绿框 2 处应该填写什么内容?
7. 如果直到low>high时依然没有找到 key,则说出“没有”。程序创建完成。
8.此程序运行结果如下。
以上内容节选自下面两本书。
作者:金钟勋
译者:小七里
顺应“编程教育入课堂”趋势,从小培养孩子的编程能力,赢在当下
从编程本质——算法入手,掌握核心编程能力,形成更加具备逻辑性的数学思维和解题思维
运行程序—边学边做—思考应用,讲解由浅入深,配合大量彩图,初步培养计算机科学素养!
中小学生也能轻松掌握算法!
书中讲解了中小学生也能轻松理解的算法,通过运行程序、边学边练、思考应用等操作,帮助孩子准确理解算法概念,培养解决问题的能力。书中利用Scratch分步实现算法的核心内容,引导孩子独立思考并完成学习。通过Scratch软件增添了算法学习的趣味性,又通过算法讲解丰富了Scratch的理论背景,双管齐下,培养孩子的逻辑思维能力。
作者:阿部和广,仓本大资
译者:陶旭 项远方
玩游戏,不如让孩子自己做游戏
让孩子开拓视野,拓宽思维,爱上编程
畅销书《Scratch少儿趣味编程》系列的第二本
采用升级版本的Scratch 2.0教大家如何用Scratch设计程序
本书内容不仅综合了数学、科学、音乐、实践等科目,而且贯彻了STEAM教育理念,旨在引导读者通过实践来探索、发现并理解现实中的知识,在激发创造力的同时提升思考能力和与他人的协作能力。
本书图文并茂,寓教于乐,适合中小学生等初学者自学或在家长的帮助下学习。
人都说兴趣是最好的老师,如果我小时候是这样学算法和编程的,现在的我是不是对编程爱得更多一点呢?你身边有没有小朋友早已接触了 Scratch ?上边的书你最想送给谁看?留言跟大家分享一下吧,精选评论挑 3 人送以上图书任一本,截止2018.9.7。欢迎小伙伴们畅所欲言。
题图来自:Freepik
☟ 更多少儿编程图书