摘要:随着人工智能产业的快速崛起,社会对具备“算法思维”创客人才的需求在不断增强。有过程序算法历练的创客,一般会拥有系统思维和较有深度的逻辑思维与计算思维,他们能在未来更好地适应社会,创造价值。本文从一般流程、多元方法和反思之道三个维度入手,阐述了程序算法学习中优质的算法建模培育策略。
关键词:创客;程序设计;算法建模;流程;方法
中图分类号:G434 文献标识码:A 论文编号:1674-2117(2018)21-0013-03
当下,在中小学校园中,越来越多的师生正在践行创客教育,在信息技术高速发展与人工智能快速崛起的背景下,将硬件与软件融合一体的项目智造更是师生创客的首选路径。在创意智造的项目创作中,程序是项目智能设计的灵魂,程序设计的优劣直接影响着最终的项目成败,所以越来越多的师生把程序设计当做创客学习的必修课。
在程序设计学习的过程中,学生对具有显性化规则的程序语言学习较容易掌握与理解,而真正指向程序学习核心的算法建模内容的习得却处于相对薄弱的状态。学生优秀的算法建模能力的养成,除了长期的学习外,还需要具备优秀的学习策略。我们在经过长期的探索与实践后认为,通过让学生掌握一般流程、习得多元方法与养成反思习惯这样三个维度的教学策略,可以高质高效地培育并提升学生的程序算法建模能力。
掌握一般流程,架构思维蓝图
学生从问题到程序的整个算法建模过程具有一定过程,并非一步可达。明确学生在建模过程中的每一个步骤,能更精准地指导教学,让施加在每个步骤之上的策略更加合理与高效。而学生掌握了一般流程则能加快算法建模学习进程,形成优秀的算法建模能力。
1.分析问题阶段
学生在阅读问题时即开始分析问题,逐渐明确题意与问题的方向。根据问题的描述方式,可将问题区分为良构与劣构,对于劣构类型的问题,学生在分析问题的阶段应更注重分析问题,注重细节,明确题意。
例如,“排队接水”一题属于劣构形式的问题,学生必须仔细阅读分析并明确问题的方向,经过问题梳理与条件的提取,明确问题方向为:所求平均等待时间(总等待时间)最小(如下页表)。
2.初步猜想算法阶段
当学生明确了题意后,大脑即自动进入算法猜想环节。想象并非凭空,而是依据题意进行有目的、渐进式的推导。学生会根据问题中已有的或明确的样例,在脑中逐渐形成算法雏形,而初学的学生则可以借助纸笔,边猜想边做推演。
3.算法验证与修正阶段
学生在经过分析问题与猜想的过程后,总有不完善、不正确的地方,那就需要验证与修正,在此过程中,教师一般引导学生在纸上利用问题中样例数据来检验猜想的算法,检验能否得出正确的求解,如不正确,则需要修正算法雏形,然后再次进入验证环节,直至得出正确的结果。
4.程序代码形成阶段
在明确了算法过程且验证无误的情况下,学生便可上机形成完整的算法程序,在此阶段学生将纸上的算法代码化,此阶段是终点,但仍需要学生在写完程序后进行调试,完善自身的算法。教师需引导学生明白完成的算法并不是完美无误的,需要查找可能存在的纰漏,让自己的算法不断接近直至达到最初问题所指向的准确结果。
借助多元方法,夯实建模效能
为让学生更好地巩固与内化算法建模的一般过程,我们提炼了几种分别适用特定过程的方法,以便让学生在算法建模的过程中能自觉地在脑中搜索适用于该过程的方法,进而提升建模效率,巩固建模方法与过程。
1.学具模拟法
学具模拟法一般是利用具体可触的物品作为推演的工具,来辅助分析问题与算法雏形建模的一种辅助手段。对于学生来说,呈现于眼前的直观实物,能直接刺激感官,激活形象思维,又直接与其经验发生作用,进而提升对问题的理解。学具模拟法使学生在算法雏形建模阶段让算法的猜想依托于实物之上,让思维过程明确且条理清晰。
需要明确的是,此处的“学具”不一定是实物,它可能是学生在分析问题与猜想算法过程中利用纸笔绘出的模型。借助于这些学具模拟,学生能更好地体验从实体到抽象的构建过程。
2.模板改进法
这里的模板指的是算法模板的框架,可以认为是一种或者一类算法的大致算法或者思路。此种方法经常适用于学生算法建模的分析问题与初步猜想算法的过程。在针对特定的问题分析时,让学生尝试回顾以往所学,即從大脑中搜索已有的算法模型,看是否能经过一定的改变达到适切于当前问题的分析与解决。
由于算法建模学习是一个迭代提升的过程,在学生已具备的知识结构中,往往能搜索出与之匹配或近似的模型加以利用。学生利用这种方法不断提升自身举一反三的能力与算法建模效率,并能继续构建充实与升级已有的知识库。
3.样例符号法
样例符号法常常作用于算法构建的猜想与验证改进阶段,当学生得到初步的算法模型后,就需要逐步将算法模型符号化、抽象化、精确化。
这里采用具体的数值进入到算法模型的运作中,明确数值在算法的每一步的转换与变化;同时,继续采用变化构造出不同类型的有效数据多次参与计算,找出可能存在的漏洞与错误,在整个算法建构过程中尽早地发现问题,并加以纠正。同时在数值计算与验证中逐步地将算法符号化,甚至形成“核心伪代码”。
4.例程调试法
根据前期的算法构建步骤后,学生已经明确算法的各个环节,最后一步便是将其形成程序。通过前期的分析与准备,思路已相对清晰,对于逻辑结构清晰的算法,学生能比较轻松、准确地堆砌出正确的程序代码,但有时却因为算法流程、逻辑上的特点超越了学生已有的能力水平,学生无法顺利完成程序代码。对于此阶段的一些问题,我们引导学生采用例程调试法来学习编写模块代码,让学生从程序代码的基本流程出发,调试跟踪数据的变化,从样例程序的内部原理了解算法模块的本质,进而能从例程中达到举一反三的效果,同时也建构了某一类算法的通用结构。
例如,在学习使用“递归”结构中,让学生从斐波那契数列计算的递归的样例程序开始,自行调试观察递归结构的“自己调用自己”的特点。学生在采用单步跟踪的同时,观察相关变量值f的变化,而后结合程序代码与纸笔演算,反向推导出斐波那契数列的函数表达式。在此过程中,学生掌握的不仅仅是递归的结构,更加深理解了递归调用中程序跳转与堆栈利用的本质原理。在了解掌握了斐波那契类的递归算法之后,学生会比较容易掌握理解十进制转二进制、求两数的最大公约数的原理,同时也为后续学习诸如快排、搜索、分治、并查集等算法中的基础递归模块结构打下基础。
养成反思习惯,促进自我提升
反思是对已学知识的回顾和深层思考,是对自己学习过程和学习方法的审视,是从元认知的层面开展的学习活动。在程序设计的学习中,反思必不可少,它是促进算法理解、进行算法建模的必要环节。
1.课堂“互动性”反思
在学生刚开始学习程序设计知识时,教师需要充分发挥主导作用,引导学生及时反思,进而学会反思的方法,养成反思的习惯。在课堂教学中,教师可以从学生在练习中出现的典型问题入手,引导或帮助学生分析其中的错误,如由程序运行结果逆推症结所在,根据程序运行的错误提示找到问题的根源,由他人的程序代码看到解题方法的多样性,通过分析他人的程序意识到自己代码的繁琐。这样,不仅可以让学生意识到自己所编程序的问题所在,而且有助于其形成及时反思的习惯,提升程序性知识的自动化程度。
2.平台“一对一”反思
学生课堂学习之后,需要一定量的练习来巩固和反思所学知识点。然而传统的课后练习很难让学生得到及时的反馈,进行深层的反思学习,实现算法建模和知识内化。由此,我们充分发挥技术优势,架设习题测评网站。平台能够基于对提交的程序比对输入输出数据的方式自动批阅学生程序,给予学生及时的反馈,学生可针对提示的错误类型进行程序的修改和测试,进而思考问题的所在,审视自己的算法,进行深层次的反思学习。此外,针对问题程序,教师可以给予一对一形式的反馈,让学生能够及时面对自己的知识学习过程,拓展其进步的空间,加深其對知识的理解,促进其开展反思性学习。
程序设计学习的最终目的是让学生触碰程序算法核心,培养学生优质的算法建模能力与算法思维。我们在教学中可从上述三个维度出发,通过了解与掌握算法建模的一般流程,让学生学习掌握多种算法构建方法,并逐步养成良好的反思习惯,最终让学生具备优秀的算法建模能力。
参考文献:
[1]舒春平,董永建.Free Pascal语言与基础算法[M].北京:科学技术文献出版社,2014.
[2]沈斌帅.借巢引凤,锤炼信息学复赛精品题[z].2013.
[3]浙江省宁波市江北区教研室.江北区第三届信息学竞赛[z].2011.