徐畅++杨莉
摘要:算法是程序的灵魂,本文结合教学实践,提出了三点改进和加强学生算法设计技能的做法,有效地提升了学生的算法分析与设计能力,以及编程能力。
关键词:高职学生;算法设计;技能训练
中图分类号:G710 文献识别码:A 文章编号:1001-828X(2016)025-000-01
著名的计算机科学家N.Wirth曾经提出过这样一个公式:程序=数据结构+算法[1]。其中数据结构指的是数据与数据之间的逻辑关系;而算法指的是解决特定问题的步骤和方法。在一个程序当中,算法是整个程序的灵魂,数据结构是加工对象,而语言只是实现的工具。由此可见,算法在整个程序设计当中有着非常重要的地位。因此,教师在教学中,不能够仅仅只满足于让学生掌握好程序设计语言的基础,更关键的是要培养学生的计算思维,加强学生的算法设计能力,以及利用计算机处理和解决问题的能力。笔者长期从事程序设计类课程的教学和研究,下面就来谈一谈在程序设计教学中如何改进和加强学生算法设计技能的几点做法与体会。
一、利用阅读填空法来训练学生的算法设计技能,锻炼学生阅读算法的能力
目前,在教学过程中有关算法设计技能的训练方法仍然普遍采用的是非常传统的方法。即老师向学生布置算法设计作业,而学生根据作业题目的要求来设计算法,然后将算法用程序实现,并上机调试验证。这种传统方法的优点是可以充分地发挥学生在算法设计方面的主观能动性;但缺点是一旦学生遇到稍复杂一些的题目,算法设计难度较大,就会感到无从下手。而如果将这种传统的让学生把算法从头写到尾的训练方法,转变为算法阅读填空法,就可以弥补传统训练方法的不足。阅读填空法是将编写好的算法去掉若干语句或表达式,然后配上必要的一些算法说明,让学生在阅读过程中将这些空白填起的一种启发式的训练方法。实践证明,在学习的初、中期阶段,利用阅读填空法来训练学生的算法设计技能,既可以锻炼学生阅读算法的能力,又可以让学生在阅读的过程中体会算法设计的严密性和周全性,使学生形成良好的程序设计风格。
二、在训练算法设计能力时,要找到算法之间的相通点,提取共性,学会对算法进行归纳和总结
在程序设计的教学中会需要学生掌握许多的算法,每一种算法都有适合它使用的范围;虽然每种算法都是在特定条件下所提出的,但我们发现某些算法之间也仍然会存在有一些相通点。如果在介绍算法时,教师能够从这些共性上出发,将更有利于学生对相关知识的理解和掌握,提高他们的学习效率[2]。
例如,有序表中的数据查找,就可以采用折半查找、斐波那契查找、插值查找等多种查找方法来提高查找的效率。这些查找方法虽然在实现的过程中有所不同,但其算法思想是相通的,在学习的过程中就可以对它们进行归纳。
设某有序表的查找范围是[L,H],在L到H的范围内找一个点t,则[L,H]被分成了三个区间:[L,t-1]、t、[t+1,H],而要查找的数据必定存在在其中的某一个区间里。当点t等于要查找的数据时,则查找成功;否则缩小查找范围,在[L,t-1]或[t+1,H]中进行下一步的查找。如果对于点t采用不同的设置方法,就会得到不同的查找方法:(1)当将点t设置为区间的中点时,就是折半查找;(2)当将点t设置为区间的黄金分割点(斐波那契)时,对应的就是斐波那契查找;(3)当将点t设置为线性插值的分点时,就是插值查找;(4)当点t是区间里的随机点时,则对应的就是随机查找。如果将点t的选取用一个函数来表示,则上述这些查找算法从总体上来看都是基本相同的。可以利用C语言统一描述为:
int Search(STable T,KType k)
{ int H, L,t;
H=ST.length-1;
L=0;
while(H>=L)
{ t=tpoint(L,H);
//tpoint()为点t的选取函数,不同的查找方法实现是不同的
if (EQ(k,T.elem[mid].k)) return(t);
else if(LT(k,T.elem[mid].k)) H=t-1;
else L=t+1;
}
return(-1);
}
三、从多角度去思考,对同一问题让学生寻找不同的算法去解决,从而培养学生的发散性思维,提高创新能力
在算法设计时,不但要求能够针对问题设计出一种正确的算法,还要追求算法的结构合理、可读性强和时空效率高等更高目标。因此,通过对学生的算法设计技能进行培训,能够培养他们的创造性的思维,提升其创新能力。对于一个问题,不仅仅只满足于找到一种解决的方法,而是要求学生能够从多方面、多角度地去思考,找出不同的解决方法,用不同的算法去实现,这样可以更加有效地开拓学生的思维。在这一过程中,通过对不同算法进行比较,也可以让学生发现和总结这些算法的特点。
例如,在数组A中存放有n个整数(从A[1]开始存放,A[0]未用),请设计一个算法来判断数组A中是否存在相同的元素。
算法1,将数组A中的每一个数组元素A[i](1≤i 算法2,首先将数组A进行排序,如果数组A中存在相同数组元素,则排序后相同元素一定相邻;然后将数组A中相邻数组元素进行比较,即比较A[i]与A[i+1](1≤i 参考文献: [1]谭浩强.C语言程序设计[M].北京:清华大学出版社,2000. [2]董永生,郑林涛.算法设计与分析课程教学的探讨[J].信息与电脑(理论版),2015(08) 作者简介:徐 畅(1982-),女,汉族,湖南长沙人,湖南安全技术职业学院讲师,研究方向:程序设计和计算机技术。
现代经济信息2016年25期