马丽燕 于方军
Python是一门高级动态编程语言,简洁、易读,还带有丰富的第三方库,能提高编程效率,很多开源的人工智能算法库也是用Python完成的,因此很多地区的中学信息技术课本引入了Python编程教学,课程内容基本都涉及程序设计基本方法和算法思想的体验。以Scratch为代表的图形化编程可以在小学入门阶段学习,而Python语言则可作为进阶编程语言在中学学习,虽然Python未使用图形化的编程方式,但其大量的内置函数可以将一些具体的小任务细节封装,进而帮助学生把注意力集中到解决问题的逻辑上,写出的代码也便于阅读理解,从而更加符合中学生从形象思维过渡到抽象思维、数理思维的智力发展过程,有利于培养学生的计算思维和编程能力。
虚谷号预装了Python,可以方便地开展Python教学,同时虚谷号支持硬件,能帮助学生在真实的环境中感受程序的魅力。例如,我们可以用虚谷号的Python程序编写一个“光控灯”程序,让学生感受“如果……否则……”的分支结构。另外,虚谷号的Python编程环境预装了占用资源比较大的jupyter notebook,因而建议用IDLE,在虚谷号上可以用“sudo apt-get install idle3”完成安装,在网络环境比较好的情况下是能够很快完成的。
Turtle库是Python语言中一个很流行的绘制图像的函数库,运行起来就像一个小乌龟,它在一个横轴为x、纵轴为y的坐标系中,根据一组函数指令的控制,从原点(0,0)位置开始移动,从而在它爬行的路径上绘制了图形,与Logo语言类似,非常适合设计中小学生的Python入门课例。
图1就是用Turtle库学习程序结构的例子,即利用计数循环画一个正四边形的案例,通过这个例子可以进行拓展,让学生设计画正五边形、正六边形……体验在循环语句中如何设计循环次数、循环条件等,这种以画图的形式呈现的直观形象的方法,符合学生的学习习惯。
虚谷号自己有一个虚谷库(xugu.py),支持LED灯、马达、传感器等硬件,这些硬件兼容Arduino环境,也就是说Arduinon能用的硬件在虚谷号上基本都能用,如果说基于Turtle库的教学能让学生“看得见”,那么基于虚谷库的教学除了可以实现“看得见”,还能让学生“感受到”。虚谷库的使用我们可以通过下面的“點灯”案例来体验:导入虚谷库“import xugu”,通过led=xugu.LED(8)让虚谷可以控制接在端口8上的LED灯,led.on()点亮灯,led.off()关闭灯(如图2)。
这个案例可以让学生体验无限循环编程结构,如让学生实现一个“灯闪烁”的案例,就类似于Arduino中的blink案例实现LED灯亮一秒、灭一秒效果(如图3)。
教材中设计的算法一般是“枚举法”,枚举法就是将问题所有可能的结果一一列举,从中筛选出正确的答案。一般学习了循环结构,就可以学习枚举法算法,利用有限的循环嵌套列举问题的所有结果。这种问题的时间复杂度为O(na),其中a可以是1、2、3或者其他常数,但一定不能是变量,一旦问题时间复杂度上升到O(nn),那么我们一般就不再叫枚举法,而是称为“搜索”。
计算机常用的算法大致有两大类,一类叫蛮力算法,一类叫贪心算法,前者常使用的手段就是搜索,借助计算机的高速运算能力对全部解的空间进行地毯式搜索,直到找到指定解或最优解。“搜索”一般通过递归来实现,常见搜索方法有“深度优先搜索”和“广度优先搜索”,但这些方法对于初学者来说往往不是特别容易理解,下面先重点介绍通过循环来实现的枚举法。使用枚举法的关键有两点:一是确定枚举范围;二是验证答案的判定条件。典型的例子就是找水仙花数,水仙花数是指一个三位数,它的每个个位上的数字的3次幂之和等于它本身(如1^3+5^3+3^3=153)。
根据水仙花数是一个三位数可以确定枚举范围是range(100,1000),对于每一个三位数i可以得到百位数a=i//100,十位数b=i//10%10,个位数c=i%10,判定条件是ifi*i*i+j*j*j+k*k*k==i*100+
j*10+k,参考代码如图4所示。
还有一种方法是枚举每一个数字——百位数的枚举范围是range(1,10),十位数的枚举范围是range(0,10),个位数的枚举范围是range(0,10),特别注意百位数是不能为0的,而十位数和个位数是可以为0的。判定条件是i*i*i+j*j*j+k*k*k==i*100+
j*10+k,参考代码如上页图5所示。
其他如百钱买百鸡、鸡兔同笼问题都可以用枚举法完成,“枚举法”是非常简单实用的算法。
另外,递归算法也是中学阶段应该学习的一种算法,它是指如果函数等在其定义或说明内部直接或间接地出现有其本身的引用,或者为了描述问题的某一状态,必须用到它的上一状态,而描述上一状态,又必须用到它的再上一状态……这种用自己定义自己的方法,称之为递归。使用递归算法关键点有三点:一是符合递归的描述,即需要解决的问题可以化为子问题求解,而子问题求解的方法与原问题相同,只是数量增大或减少;二是递归调用的次数有限;三是必须有递归结束的条件。
利用虚谷号的Turtle库学习递归算法也是非常直观的,如图6所示是通过画“科赫雪花”体现递归算法,帮助学生理解函数、递归调用等概念,进而有效培养学生的计算思维。
通过枚举法的实例我们知道,只要解决好了“定枚举范围”和“验证答案的判定条件”这两个关键问题,就可以利用“枚举法”解决各种问题,对于递归算法要确定好递归体、递归次数、递归结束条件。另外,算法的实例也可以结合虚谷号用硬件实现,如可以用虚谷号做个小车走迷宫,通过枚举方式找到所有的走迷宫可能,还可以用到其他的一些复制的机器人程序和人工智能程序中,如果学生们感兴趣,可以通过社团或竞赛作品形式,帮助学生体验用虚谷号编程带来的快乐。