杨一奋
摘 要:作为一种实现算法的有力工具,图形计算器不但可以将算法化的思路落到实处,更可以在可视化的基础上提供分析算法的通道. 文章从实例出发,详解了算法实现和算法分析的具体操作,并提出基于图形计算器的手持特点,可以使“算法”成为学生主动建构的结果,而其中蕴涵的算法思想恰是学生所真正“可以理解、可以学到手和加以推广应用的”.
关键词:算法实现;图形计算计算器;算理;算法比较
我们知道,算法是指为解决问题而实施有穷操作过程的描述,更是一种便于机械化的重复迭代,学习算法需要学习程式化的过程,因此,“算法思想已经成为现代人应具备的一种数学素养”.其中算法分析和算法实现是两个重要步骤,没有算法分析,我们无从检验算法设计的正确性;离开算法实现,我们的算法学习只能停留于“纸上谈兵”阶段. 事实上,算法设计的优劣需要上机检验,算法设计的改进需要调试修正,更重要的是让学生在计算机上实现问题解决的同时经历一个由不那么精确、不那么完整到比较精确、比较完善的发展过程,使“算法”不仅是宣布某个结果,而且也是学生主动建构的结果,因此算法教学应提倡算法化.
虽然从理论上讲算法教学离不开算法实现,但应用实际却停留于“纸上谈兵”,究其原因还在于伪代码表示的算法不能被计算机所“接受”,虽然几何画板、Excel也能实现算法,但却颇费周折. 作为一种集数值计算、函数图象显示、编程、数据分析等功能于一身的手持式信息技术,图形计算器无疑为算法实现提供了一条捷径. 以Casio fx-CG20为例,借助其自带的【程序】模块,可以轻松实现“提出问题→建立模型→设计算法→编写程序→计算器调试”的算法教学全过程.
计算器语法与伪代码的转换
通常教材中描述算法用的是伪代码,虽然方便表达,但却有着不可执行性,为方便起见,我们将图形计算器语法与伪代码的表达比较如表1.
循环结构的算法实现
我们知道,算法的价值在于机械化(为计算机所能执行)的重复执行,因此循环结构是算法的重点和核心. 循环结构的构造关键在于:循环体的形成、相应循环变量的赋值以及循环结构的控制(包括循环的执行和终止),也就是说“从什么地方开始”,“反复做什么”,“在什么条件下结束”.
例1 设计一个算法,计算100以内被3除余1的所有正数的和.
【算法分析】 符合条件的数为1、4、7、…、100共34个数,本题就是求这34个数的和,即从1开始,反复累加比前一数大3的数,直加到第34个数为止. 循环次数确定时一般考虑用For循环设计程序,可考虑用累加变量S(初始值设定为0)来接受结果,从而循环体中的赋值语句S+I→S(其中I为计数变量,I的值分别对应1,4,7,…,100). 具体程序如图1所示.
图1
【算法释疑】 For循环结构比较简单,往往通过计数变量来控制循环结构(本题中I为循环控制变量),其中“1→I”为对循环控制变量赋初值,“Step3”相当于语句“I+3→I”,而“To 100”则表示循环的结束,相当于While循环中的“While I≤100”,图1的程序如果改写成While循环则程序如图2所示.
图2
例2 设计求满足条件12+22+32+…+n2>102的最小正整数的算法.
【算法分析】 由于n的值事先不知道(也就是说循环次数不确定),我们只能通过试错的方法,用从1开始反复累加比前一个数大1的数的平方,然后将和与105作大小比较,直到和大于105为止,一般情况下这样的算法我们采用WHILE循环(设置累加变量S、计数变量n)来实现,伪代码程序如图3所示,计算器实现如图4“所示”.
图4
计算器中的算法比较
在计算器中虽然可以较轻松地实现算法,但在算计设计过程中我们常常会出现循环体语句倒置的问题,如例2中我们就容易出现语句40和语句50对调的情况,这样执行图5的程序产生的结果(执行结果为68)却和图5的结果(执行结果为67)相迥异,于是摆在我们面前的问题就是哪一个算法正确,如何修正算法?
图5
解决问题需要追踪每一次循环执行后算法变量值的变化,手工操作显然不易,一个可行的思路将变量值输出到【统计】模块中,通过列表的方式将数据“看得见”. 具体操作是在程序中插入两段语句(如图6和图7中标注部分),语句的含义是把变量的结果按顺序输出到表格的第1、2、3、4列中. 然后切换到【统计】模块,可以发现1~4列均有数值输入,拨动BN键仔细观察列首(图8)列尾(图9),可以看出程序“I”中变量N、S的赋值有一定的错位(见图中标注部分),从算法分析可以看出,程序5需要做一定的调整(或者循环前变量N的初值赋值变更为“1→N”,或者循环后增加语句“N-1→N”). 更进一步的思考是程序4是先递进后累加,而程序5则是先累加后递进,从而可以看出需要重视循环体中语句的顺序,分析算法往往需要追踪循环的前面两步和最后两步.
图8
图9
利用图形计算器在不同模块的关联性,我们可以实现循环变量的追踪,其实我们还可以将算法中的结果可视化.
例3 随机模拟法估算圆周率的算法实现.
进入【程序】模块,输入图10所示的程序命令,其中第2行到第4行的语句是画正方形、画圆语句,此外“Read Plot A,B”是描点语句;按F1执行后,可得到图11所示的结果.
通过图文并茂的展示,我们不但可以帮助学生确信结果,更可以将注意力放在算法原理的剖析上:程序中数值A、B为0~1之间的随机数,这样构成的点(A,B)一定落在单位正方形内,而通过条件判断可以考察点(A,B)是否在圆(x-0.5)2+(y-0.5)2= 内,在圆内则统计,不在圆内则不统计;如果总共产生N个随机点,而落在圆内的有K个点,这样有概率计算公式 ≈ ,即π≈ .
综上可知,作为一种实现算法的有力工具,图形计算器无疑为信息技术与数学学科的整合提供了新的思路和选择,从而从技术层面确保了算法化教学的开展. 我们也应看到,语言只是工具,算法才是程序设计的灵魂,何况“算法”应是学生主动建构的结果,因此我们关注算法实现也要重视算法设计和流程图的教学,更要创设问题情境让学生有机会探索解决问题的算法,唯有如此才能保证蕴涵在算法中的算法思想为学生所真正“可以理解、可以学到手和加以推广应用的”.