摘要:当算法作为重要内容第一次被列入高中数学的必修课程时,曾引起了强烈的反响。如今,算法在中学的第一轮教学实验已经结束了。本文从一个教材编写者的角度出发,汇集了实验中的一些经验和教训,并将思考和整理的结果呈现出来,希望引起更多读者对这一议题的研讨。 “算法初步”一章在中学的第一轮教学实验已经结束了。这一首次出现在中学数学课程中的内容,既给一些教师造成了巨大的压力,成为他们教学的难点,也激发了一些教师极大的兴趣,为他们发挥创造力和施展个人特长提供了很好的机会。总体来说,教师们在教学的过程中一般都投入了很大的精力,也积累了一些成功或失败的经验。作为“算法初步”的编写者之一,笔者一直密切关注本章的教学实践,也非常希望已完成本章教学或正在为此做准备的教师,都积极参与到本章的教学研讨中来,使“算法初步”在中学中的教学得到进一步的成熟和完善。本文的目的就是试图从教材编写者的角度出发,对“算法初步”的教学做一个总结,特别是介绍教学中一些好的想法和做法,以起到抛砖引玉的作用。 一、引入算法的必要性 算法的引入在中学数学教师中曾引起过强烈的反响。其中一些教师持不理解的态度,如有的教师认为这些内容缺乏“数学味”,属于信息技术课程的内容,因此安排在数学课程中是不合适的。 笔者在实践中发现,对于大多数教师来说,算法的教学确实大大加重了他们的教学负担。但是,算法的引入仍然具有必要性,它理应受到“欢迎”,而不是“排斥”。下面,从三个方面对在中学数学的基础课程中引入算法的必要性做一个阐述,希望能够解答一些教师的困惑,提高算法的支持度。 就像人类发明机器是为了拓展人的生产能力、发明交通工具是为了拓展人的行动能力一样,计算机的发明是为了将人的抽象思维能力拓展到自身以外。每一天,我们使用计算机的 电子表格、字处理器、网页浏览器等程序块来完成各种各样的任务。表面看来,计算机做的事情非常漂亮,但那只是一种幻觉。计算机可以做的所有事情只是非常快速地操作由1和0组成的数字。另一方面,我们人类却不能用1和0进行思考。 算法就是将人类的思维能力形式化为计算机可以执行的步骤,使得若干微小的电子元件代替人类进行思考。具体过程是先将解决问题的一系列步骤写成算法,再翻译成某种程序设计语言在计算机上实现,就得到了我们每天操作的程序块。因此,算法是计算机科学的核心,换句话说,算法是计算机程序的基础。没有算法,计算机的存在也就失去了意义。 随着社会和科学技术的发展与进步,科学的两大研究方法──理论和实验越来越多地表现出局限性。许多研究的对象既不可能用理论精确地描述,也不可能通过实验手段来实现,而计算方法与之相比,有其独到之处。 科学计算是20世纪后期才兴起的一门学科,如今已经广泛渗透到生物医学研究、基因工程、太空探测和每日天气预报等各个领域。人们利用计算机进行模拟和实验来理解现象,猜测新的事实,发现新的理论,使各个领域的研究都获得突破的可能。例如,医生想知道病人大脑或其他器官的一些情况,他无法简单地将病人解剖来进行观察,但可以利用计算机来处理超声波或磁场共振信号,并建立可视图像;经济学家想为政府制定经济政策提供辅助信息,若采用在局部区域内制定实验性的经济政策的方法,可能会给该区域造成巨大的损失,但通过建立经济行为的算法模型,模拟各种经济现象,则可能得到理想的结果。 科学计算对每个专业和每个研究领域都产生了巨大的冲击。随着几乎所有学科走向定量化和精确化,科学知识结构也发生了巨大的变化,产生了一系列计算性的学科分支,如计算几何、算法数论、计算统计、计算流体力学、计算量子化学、计算胚胎学、计算地质学、计算气象学、计算材料科学、计算天文学等等。 现在,科学计算继实验、理论之后,已经成为第三种科学研究手段。 (三) 计算思维时代的到来 在以规模化大生产为特征的“机械时代”,一般不需要劳动者拥有出众的才华或者独特的创意,在这种体制下培养出的人才是“模式化”的、“整齐划一”的,劳动者只需要掌握自己所从事工作的基础知识,并按照上级的指令认真做事就可以了。 如今,我们的生活方式正在被计算机和网络所日益改变着。更加重要的是,计算机不仅在形式上改变着我们的生活方式,而且从思维的深处改变着我们认识世界、改造世界的方式,对我们如何思考所面对的问题和如何解决问题都产生了深刻的影响。 21世纪是创意与构思的时代,有意识地培养学生的算法思想,帮助他们构建算法意识,以“算法的视角”看待和解决问题,必将有利于他们未来的发明与创新。 传统程序设计语言的教学往往存在一个弊端,即让学生过早地纠缠于程序的调试和实现,而任何一种程序设计语言通常都涉及到大量与技术问题相关的烦人细节,使得成功编译和执行程序需要花费大量的时间。事实上,每一种程序设计语言都是为特殊的目标而创建的,都是将算法转换为计算机程序的工具,因此它们之间的差别只是一件小事,算法才是关键所在。 在数学课程中,算法的教学更应该关注的是算法对问题的抽象过程和算法的构建过程。在这个过程中,使学生着重理解算法的“算理”,同时体会算法的程序性、明确性、有效性和有限性等特点,学习设计和描述算法以解决实际问题和与人交流,发展有条理的思维和表达能力,提高逻辑判断能力。因此,在数学课程中,应该尽力让学生在简单的计算机语言环境中学习算法的基本知识,而把有效设计、实现、调试和测试程序的任务留给信息技术等其他课程。从这个层面上说,在教学中应该把程序框图作为描述算法的主要工具。 另一方面,进行算法的教学又不能完全脱离计算机程序设计。这是因为,我们要讲的算法不是广义的解决现实中一切问题的算法,而是“用计算机来解决某一类问题的程序或步骤”。这就要求学生在设计算法时,调整以往的解数学题的思维方式,设计出明确、有效、有限、可以转化为计算机程序的算法步骤。同时,还要理解一些在计算机程序设计中所惯用的做法,主要是设置变量和赋值。例如,在求前100个正整数的和的“累加器”中,包含算法步骤“sum=sum+n”“n=n+1”,它们表示的不是相等,而是赋值过程,但很多学生在初学算法时都难以理解。为了解决这个问题,可以在进行三种基本逻辑结构的教学时,结合具体例子帮助学生学习如何设置变量和进行赋值。 通常,人们在用计算机解决问题时,先在头脑中构思一个算法(这类似于教科书中的用自然语言描述算法),接着画出程序框图形象直观地把算法表达出来,然后再根据程序框图编写计算机程序。我们进行算法教学,也是遵循类似的过程进行的。首先,让学生在理解算法概念的基础上,学习用自然语言描述算法,然后,教学生画程序框图表示算法,最后,让学生将程序框图转化为计算机程序,在计算机上实现算法。 笔者认为在上述算法教学的过程中,教学的重点是算法的三种基本逻辑结构,即顺序结构、条件结构和循环结构。这是因为,三种基本逻辑结构被认为是一个良好算法的基本单元,换句话说,要设计出一个结构良好、易读好懂的算法,就必须以三种基本逻辑结构为基础来构建算法。而且,三种基本逻辑结构中蕴涵了比较深刻的思想。顺序结构反映的是“step by step”的思想,即把解决问题的方法步骤化,一步一步地执行;条件结构反映的是“先判断、后执行”的思想,计算机区别于其他机械的能力就来自于算法做判断和按判断的结果行动的能力;循环结构蕴涵的是“递推”的思想,由于学生还没有学习数列,对这种思想方法还是初次接触。由三种基本逻辑结构顺序构成的程序框图,明确简练,结构分明,很容易改写成计算机程序,而程序设计语言中的赋值语句、条件语句和循环语句可以看成是三种基本逻辑结构的“机器化”。 教学算法的三种基本逻辑结构,结合程序框图的教学进行为宜。具体做法是:首先,结合程序框图,帮助学生理解三种基本逻辑结构的含义;然后,在设计一个算法的程序框图的过程中,选择合适的基本逻辑结构表示算法步骤。 下面,对算法的三种基本逻辑结构作一些具体的说明,供教师参考。 1. 顺序结构 顾名思义,顺序结构就是按照算法步骤排列的顺序,逐条执行算法。如图1所示,虚线框内是一个顺序结构,步骤n和步骤n+1是顺序执行的。顺序结构在计算机中表现为,计算机按照语句出现的先后次序执行的一串语句。一般来说,学生对顺序结构的理解没有困难。 2. 条件结构 条件结构是根据“条件”在不同情况下的取值选择不同的处理方法,可以在两种情况下选择一种(双分支),也可以在多种情况下选择一种(多分支)。 教科书一般只采用了“双分支”的简单情形。如图2所示,虚线框内是一个条件结构。此结构中包含一个判断框,根据条件p是否满足,选择执行步骤A或步骤B,但不会出现同时执行步骤A和步骤B的情形。 3. 循环结构 在生活中,我们有时需要重复做一些事情(如求50个学生的总成绩,需要做50次加法运算,每次加入一个学生的成绩)。从完成这类事情的过程中,可以找出3个关键的地方,即“从什么地方开始”“反复做什么”“在什么条件下结束”。计算机的运算速度快,最善于进行重复性的工作,可以将人们从繁重的重复运算中解救出来。循环结构可以让计算机在某个条件成立的情况下重复执行某个步骤。在构造循环结构时,也必须保证完成下面的事情。 (1) 循环前,初始化变量的值。 例如,在“输出1~100”的循环结构中,要先给输出的变量i赋初值1。 (2) 确定循环体。 循环体就是在循环结构中反复执行的操作步骤,例如,上述循环结构中的循环体是“输出变量i”和“i=i+1”。 (3) 设置循环终止条件。 循环结构不能是永无终止的“死循环”,一定要在某个条件下终止循环,这就需要条件结构来做出判断,因此,循环结构中一定包含条件结构。例如,上述循环结构中的终止条件是“i=100”。 循环结构有两类,当型循环和直到型循环。如图3所示,当型循环结构表示“当条件p1满足时,反复执行循环体”;直到型循环结构表示“反复执行循环体直到条件p2满足”。 相对于顺序结构和条件结构来说,循环结构的教学难度较大。这是因为,尽管学生以往对循环操作这种处理问题的方式已有一些经验,但真正接触循环结构还是第一次;而且,程序设计中的循环结构与学生熟悉的重复运算存在一定的区别。因此,需要帮助学生理解和构造适合于计算机的循环结构。 从图1~3的程序框图中可以看出,三种基本逻辑结构存在共同的特点,即只有一个入口和一个出口,每一个基本逻辑结构的每一部分都有机会被执行到,而且结构内不存在死循环。 四、典型算法模型的作用 实践证明,在进行算法教学的过程中,应尽可能选取最简单、最典型的算法模型作为载体。这是因为,一方面进行算法教学的目标是介绍算法的基本思想和初步知识,另一方面,算法本身就是与具体问题结合在一起的,空讲理论只能导致学生不能真正理解算法和不会设计具体问题的算法,而从简单、典型、学生熟悉的算法模型中挖掘、提炼出来的思想和方法,更容易被学生接受。下面,我们举两个例子说明这个问题。 (一) 条件结构与分段函数 分段函数是学生已经熟悉的内容,它的表达式根据自变量取值范围的不同而有不同的形式。在进行条件结构的教学时,可以将条件结构与分段函数联系起来,让学生设计含有条件结构的算法来计算分段函数的值。例如,要输出分段函数 对于一些应用问题,如判断某一年是否为闰年,求一元二次方程ax2+bx+c=0的实数根等等,也可以先将问题转化为分段函数,再用条件结构来构造算法。 (二) 循环结构与“累加器” 如前所述,循环结构是教学的难点。笔者认为“累加器”是一个很好的载体,借助于“累加器”,可以使学生经历把“递推求和”转化为“循环求和”的过程,同时经历“初始化变量”“确定循环体”“设置循环终止条件”3个构造循环结构的关键步骤,从而初步理解循环结构和学习构造循环结构的一般方法。 可以选择最简单的“累加器”问题,例如求1+2+…+100的值。这个问题的自然求和过程可以表示为:S2=S1+2,S3=S2+3,S4=S3+4,…,Sn=Sn-1+n(n=2,3,…,100),用递推公式表示为: 如图4所示,若直接利用这个递推公式构造循环结构,可得 显然,循环体中的步骤Sn=Sn-1+n使用了S1,S2,S3,…,S100共100个变量,计算机执行这样的算法时需要占用较大的内存。为了节省变量,需要从上述递推求和的步骤Sn=Sn-1+n中提取出共同的结构,即第n步的结果=第(n-1)步的结果+n。 若引进一个累加变量sum来表示每一步的计算结果,则第n步可以表示为赋值过程sum=sum+n, 其中赋值号“=”右边的变量sum表示前一步累加所得的和,赋值号“=”左边的sum表示该步累加所得的和,n表示该步累加的数。尽管这种赋值过程是计算机程序设计中的惯用方法,但对于学生来说可能既新奇又难以理解,在教学时需要花费一些笔墨。由sum的初始值为0,n的值由1增长到100,可以初始化循环变量和设置循环终止条件,如图5所示。 五、优化或改造算法的意义 解决同一个问题,可以有不同的算法;同一个算法稍加改造,可以用于解决不同的问题。对算法的优化或改造,是帮助学生理解算法的通用性、有效性等的良好素材。 前面我们说过,结合程序框图的教学,教授算法的三种基本逻辑结构,有利于学生对后者的理解和掌握。类似地,对算法的优化或改造,在算法的程序框图上进行,也有利于学生看清算法的结构和更好地把握“算理”。 举个例子,让学生改造求1+2+…+100的值的“累加器”的程序框图(图5),表示 ⑴ 求1+2+…+m(m∈Z*)的值的过程; ⑵ 求3+5+…+(2m+1) (m∈Z*)的值的过程; ⑶ 输出1,1+2,1+2+3,…,1+2+3+…+100的过程; ⑷ 求2+22+…+2100的值的过程; ⑸ 求使2+22+…+2n(n∈Z*)的和大于100的最小正整数n的过程; 等等。其中,⑴ 将求前100个正整数的和推广为求前m个正整数的和,只需在循环结构前给定变量m的初始值,并将循环的终止条件变为“n>m?”即可;⑵ 也是求m个正整数的和,但起始的数字变成了3,终端的数字变成了2m+1,“步长”变成了2,这时需要改变变量初始值和循环的终止条件,循环体变为“sum=sum+(2n+1)”;⑶ 在循环体中增加输出框“输出 sum”,就可以得到前n(n=1,2,…,100)个正整数的和了;⑷ 需要将循环体变为“sum=sum+2^n”;⑸ 除了需要将循环体变为“sum=sum+2^n”,还需要将循环的终止条件变为“sum>100?”。 诸如此类的例子是大量存在的,又如“判断某一年是否为闰年”的问题根据“算理”的不同有不同的算法,可以让学生寻求最简单的算法;将“除2取余法”的程序框图稍加改造,就可以得到“除k取余法”的程序框图;等等。通过这样的练习,学生不仅可以更好地把握算法的“算理”,而且也能体会到算法在解决问题中的强大威力。 参考文献: [1] 中学数学课程教材研究开发中心. 普通高中课程标准实验教科书·数学3. 人民教育出版社,2004. [2] Russell L. Shackelford. 计算与算法导论. 电子工业出版社,2003.的值,就可以用一个最简单的条件结构来构造算法。
高中各年级课程推荐
|
||||
年级
|
学期
|
课程名称
|
课程试听
|
|
高一 |
高一(上)、(下)同步复习
|
语文 | ||
英语 | ||||
数学 | ||||
数学(期中串讲) | ||||
数学(期末串讲) | ||||
数学拔高 | ||||
物理 | ||||
化学 | ||||
生物(一) | ||||
地理 | ||||
历史 | ||||
政治 | ||||
高中专项突破课
|
语文写作 | |||
英语阅读理解 | ||||
英语写作 | ||||
英语完形填空 | ||||
物理功和能量 | ||||
高二 |
高二(上)、(下)同步复习
|
语文 | ||
英语 | ||||
数学(理) | ||||
数学拔高(理) | ||||
数学(文) | ||||
数学拔高(文) | ||||
物理 | ||||
数学(期中串讲) | ||||
数学(期末串讲)(理) | ||||
数学(期末串讲)(文) | ||||
化学 | ||||
生物(一) | ||||
生物(二) | ||||
生物(三) | ||||
地理 | ||||
历史 | ||||
政治 | ||||
高三 |
高考第一轮复习
|
语文 | ||
英语 | ||||
数学(理) | ||||
数学拔高(理) | ||||
数学(文) | ||||
数学拔高(文) | ||||
物理 | ||||
物理拔高 | ||||
化学 | ||||
生物 | ||||
地理 | ||||
政治 | ||||
历史(韩校版) | ||||
历史(李晓风版) | ||||
高考第二轮复习
|
数学(理) | |||
数学(文) | ||||
英语 | ||||
物理 | ||||
化学 | ||||
地理 | ||||
高考第三轮冲刺串讲
|
语数英串讲(理) | |||
语数英串讲(文) | ||||
物化生串讲 | ||||
史地政串讲 | ||||
高考试题精讲
|
数学(理) | |||
英语 | ||||
化学 | ||||
物理 | ||||
2021高考研究2021高考策略(理) | ||||
2021高考研究2021高考策略(文) | ||||
Copyright © 2005-2020 Ttshopping.Net. All Rights Reserved . |
云南省公安厅:53010303502006 滇ICP备16003680号-9
本网大部分资源来源于会员上传,除本网组织的资源外,版权归原作者所有,如有侵犯版权,请立刻和本网联系并提供证据,本网将在三个工作日内改正。