范 红,谢颖华,孙韶媛,齐金鹏,高尚策
(东华大学 信息科学与技术学院,上海 201620)
“数据结构”是计算机专业的专业必修课,通过该课程的学习,比较不同数据结构和算法的特点,培养学生良好的程序设计风格,提高学生逻辑思维和抽象思维能力。具有扎实数据结构基础知识的学生,在未来的研究和工作中适应变动、开辟新研究阵地的能力较强,从而能够紧跟信息技术的高速发展。在以往的课堂教学中,教师着重讲解数据结构理论和算法设计思想,学生普遍感到虽能看懂算法描述,但却难以根据实际问题自己动手设计数据结构和算法。《国家中长期教育改革和发展规划纲要(2010—2020年)》对创新人才的培养模式,提出要“注重学思结合,倡导启发式、探究式、讨论式、参与式教学,帮助学生学会学习。激发学生的好奇心,培养学生的兴趣爱好,营造独立思考、自由探索、勇于创新的良好环境”。美国哈佛大学教授Eric Mazur创立了同学间互动(Peer-Instruction,简称PI)教学法,该方法要求学生在课堂上基于问题进行自主学习和讨论后,通过教师的讲解巩固所学知识,提高解决实际问题的能力,有效地改变了传统的教学模式[1]。PI教学法是将当代教育心理学的基本理论、现代教育技术整合在一起的一个很好的范例。本文就PI教学法在“数据结构”课程教学中的运用进行探讨。
Eric Mazur教授于1991年创立了PI教学法,并对该方法进行了实践和改进,取得了显著的教学成果[2-3]。具体实施方法如下:(1)每节课前提前布置给学生阅读内容,并在课堂上回答三个问题。目的是便于教师在课堂上了解学生对知识的理解程度,而不是考察学生在书本中寻找正确答案的能力。教师可根据学生的反馈情况选择即将在课堂上讨论的题目。(2)接下来的课堂时间分成几个小节,每小节重点讲解学生针对课前阅读时所反映的难点,或者是教师根据历年的教学经验而确定的一些问题。(3)学生相互之间展开讨论,交流答案。在讨论过程中,学生阐述自己的观点,并且尝试说服对方或者接受对方的观点。教师在学生间走动,聆听学生的讨论,并给出一些建议。讨论完成后,学生可以重新给出答案。(4)教师给出最终的正确答案,并进行讲解。重复步骤(2)~(4),进行其他知识要点的讨论和讲解。
设计问题是实施PI教学法的关键。问题要集中在学生课前预习时容易误解的知识点,或是教师根据以往的教学经验总结的内容。问题的难度不能太大,应使其经过讨论后得出正确答案的学生数量会有所增加。如果题目太难,学生会觉得内容模糊,讨论过程中难以有效地传达正确的信息;但题目太简单,学生就无法在讨论过程中学到知识。以下是借鉴PI教学法,在“数据结构”课程教学中,介绍“树和二叉树”一章中“遍历二叉树”[4]一节时设计的导学案。
首先布置学生课前预习内容,并提出三个问题:(1)函数递归调用的定义;(2)二叉树遍历原理;(3)举例说明先序遍历二叉树、中序遍历二叉树和后序遍历二叉树序列。这三个问题简明扼要地列出了学生自主学习的目标,既提出了学生心中的疑惑点,又引导学生转向解决问题的方法。教师在学生讨论时要适时地指导其在探究过程中遇到的疑难点。从学生的反馈情况看,他们能说出递归调用是指在函数的调用过程中又出现直接或间接地调用该函数本身,但对如何调用还是觉得难以理解。这时教师在巡回指导时需要指出,递归函数中调用自身的函数就当作它是在调用另一个函数,只不过这个函数和自己“长得一样”。每个递归定义必须至少要有一个条件,满足此条件时递归不再进行,即不再引用自身而是返回值退出。对于第二个问题,学生能够理解由于二叉树的结点之间不存在唯一的前驱和后继关系,在访问一个结点后,下一个被访问的结点面临不同的选择。遍历二叉树的问题,即如何按照某条搜索路径巡访树中的每个结点,使得每个结点均被访问一次,而且仅被访问一次。教师可向学生进一步解释“访问”是根据实际的需要来确定具体做什么,它只是一个抽象操作。在这里我们可以简单地假定访问就是输出结点的数据信息。二叉树的遍历方式可以有很多种,如果限定从左到右的习惯方式,则主要分为先序遍历、中序遍历和后序遍历。第三个问题通常是学生自主学习时间较长,最能体现生生互动、师生互动的部分。学生会得出各种各样的答案,这时就要进入到教师对重点和难点内容进行详细讲解的主导环节。
在“数据结构”课程教学时,教师可利用多媒体讲解具体的算法推导过程,在计算机中编译、运行代码,采用调试工具设置断点并逐行执行,通过观察变量的变化情况来理解算法的编写原理。这要求教师在课前把教材中的主要算法转换为可运行的C程序,程序的动态执行过程很好地对算法进行了可视化的描述。如果有条件在机房教学,学生也可以对主要算法稍作改动,通过调试运行观察结果的变化,从而加深对所学知识点的理解,使学生感到不再难以根据实际问题动手设计数据结构及算法。教师在讲解二叉树遍历算法的推导过程时,可现场调试运行程序。按先序遍历序列输入二叉树,即创建二叉树,再显示出中序遍历序列和后序遍历序列。为了能确认每个结点是否有左、右孩子,需要对二叉树进行扩展,将二叉树中每个结点的空指针引出一个虚结点,其值设置为一特定值,比如“Ф”。我们称这种处理后的二叉树是原二叉树的扩展二叉树[5]。如图1所示的二叉树,其扩展二叉树的先序遍历序列为“-*AФФBФФCФФ”,按此顺序依次输入每个结点,从而完成二叉树的构建。接下来运行中序遍历程序段,显示中序遍历序列。设置断点并逐行执行,便于观察执行语句与二叉树遍历结点的对应情况。运行后序遍历与中序遍历过程类似,可以让学生自己编程并运行,从而检验各种二叉树遍历的结果序列。通过现场调试运行程序,使学生直观看到递归函数的调用过程,加深对各种二叉树遍历算法的理解。
(a) 普通二叉树 (b) 扩展二叉树图1 二叉树
接下来进入到本节归纳整理、巩固所学知识的阶段,及时检验学生当堂课的学习成效并布置课后作业。通过分析二叉树遍历的结果发现,先序遍历时根结点在最前;后序遍历时根结点在最后;中序遍历时根结点在中间,前(左)边是左子树,后(右)边是右子树。如果已知中序遍历序列和先序遍历序列(或后序遍历序列),就可以根据先序遍历(或后序遍历)序列确定二叉树的根结点,通过中序遍历序列确定左子树和右子树,进行递归操作即可画出这棵二叉树。最后给学生布置课后作业:已知一棵二叉树的中序遍历的结果序列是DBEAFGC,后序遍历的结果序列是DEBGFCA,求这棵二叉树的先序遍历,并编程验证。
教学最主要的任务是指出教材中重要的知识点,把书本知识和学生已掌握的知识联系起来,提升学生对知识的理解能力,并能够理论联系实际。PI教学法的实施,首先要求教师精心设计导学案。这需要花费大量的时间和精力,对所介绍的知识点进行融会贯通,考虑其相关性,设计难度适中的讨论题目。题目要能够围绕课程内容积极引导学生思考,并运用多种教学方法和手段,提高课堂教学质量。
对于“数据结构”课程教学,为便于学生更好地理解算法,教师要把书本上的主要算法转换成可执行的C程序,并要求学生对算法做些改动,观察不同的输出结果,从而加深对算法的理解,增强编程能力。课堂上的概念提问以及学生间的相互探讨会占用一部分课堂时间,教师可考虑把部分教学内容作为课前阅读提前布置给学生。绝大部分学生已经习惯了被动式灌输教学,可能在开始阶段不愿过多地参与讨论,或者干脆觉得讨论是浪费时间。Eric Mazur教授等人建议教师要强调该方法的好处,把学生成绩的提高情况及时反馈给他们。在学生讨论时,要走到学生中间,帮助并鼓励他们进行讨论。学生能够成功地解释自己的推理过程,并通过动手编程加深对知识的理解,他们会意识到这种提高是无法通过教师单纯的讲解来实现的。
PI教学法对于学生参与教学活动程度不够、教学效果不理想等问题提供了一个很好的解决办法。它构建了以问题为导向,引导学生自主学习,强调学生在学习过程中的主体地位。通过学生间的展示交流以及教师的准确引导,使学生全面地掌握基础知识,从而能够熟练运用知识并最终形成能力,极大地提高了课堂教学效果。“数据结构”课程教学中运用PI教学法,还需要在教师导学案的设计以及有效开展学生自主学习等方面进行不断充实和完善。
参考文献:
[1] 张萍,MAZUR Eric. Peer-Instruction:哈佛大学物理课程教学新方法[J].中国大学教学,2010(8):69-71.
[2] MAZUR Eric. Farewell, Lecture? [J]. Science, 2009,323 (2):50-51.
[3] 袁志钟,戴起勋,陈康敏.同学间互动教学方法简介[J].中国电力教育,2009(21):93-95.
[4] 严蔚敏,吴伟民.数据结构:C语言版[M].北京:清华大学出版社,2007.
[5] 程杰.大话数据结构[M].北京:清华大学出版社,2011.