论文部分内容阅读
摘要:大学计算机程序设计课程的培养目标和教学内容一直是程序设计教学中的一项研究焦点。本文在对程序设计课程现状分析的基础上,研究了如何将"计算思维"方法应用在C++程序设计教学中,培养学生以计算思维能力分析问题,解决问题的能力。
关键词:计算思维 程序设计 兴趣案例 逆向思维
【中图分类号】G633.67
2006年,美国卡内基梅隆大学(CMU)周以真(Jeannette M. Wing)教授在《Communications of the ACM》杂志上给出并定义了计算思维(Computational Thinking)的概念。周教授認为:"计算思维是运用计算机科学的基础概念进行问题求解、系统设计以及人类行为理解等涵盖计算机科学之广度的一系列思维活动[1]"。
一、计算思维的概念
随着计算机日益广泛而深刻的运用,计算这个原本专门的数学概念已经泛化到了人类的整个知识领域,并上升为一种极为普适的科学概念和哲学概念,成为人们认识事物、研究问题的一种新视角、新观念和新方法。
二、程序设计基础课程现状
2010年在西安的九校联盟会议上要求正确认识大学计算机基础教学的重要地位,要把培养学习者"计算思维"能力作为计算机基础教学的核心任务,并发表了《九校联盟(C9)计算机基础教学发展战略联合声明》,建设了更加完备的计算机基础课程体系和教学内容,为全国高校的计算机基础教学改革树立榜样[2]。这种计算思维能力可适用任何专业,这点已基本成为共识。但如何做?目前都还处于探索中。
目前,C++程序设计基础教学存在着一些问题:
1.教学内容多,学时少。授课教师难以做到对所有知识模块都有较深入的理解。因此对教师的授课水平提出了很高要求。
2.《C++程序设计》作为大学的第一门程序设计课程,知识点多,概念多,涉及大量的算法,对于没有任何程序设计基础的学生来说,掌握教学内容十分困难。
3."狭义工具论"认为教计算机基础就是教些计算机工具及其使用方法。教材基本上是有关领域的浓缩版,学生进入大学后,对计算机课程兴趣不大,逃课率相当高。
4.计算机基础课教学学时被压缩,教学资源配置不充分,课程面临被裁减的危机。
如何明确地将计算思维融入到课堂教学,以提高学生运用计算机知识抽象和分解问题的能力,是一个挑战。
三、教学模式的探索
"计算思维"有着极强的抽象性,通过什么样的方式才能培养学生的"计算思维"能力呢?根据C++程序设计课程教学的特点以及计算思维的学习技巧和方法,可采用"兴趣案例"分析的方式,运用教学模型进行程序设计课程教学,培养学生的计算思维能力,提高教学效率和学生学习效果,从而使学生掌握程序设计方法。
《C++程序设计》的最大特点是算法多,例如"递归"算法。"递归"这个概念本身非常抽象,因此教学过程中如果只是一味的强调概念,学生不可能有很好的理解。那么怎样才能让学生明白知识点的同时又培养其程序设计的"计算思维"能力呢?1
我们以求Fibonacci数列前50项为例说明计算思维在C++程序设计中的应用。我们设计三个步骤来完成"递归"思维能力的培养。
步骤一:提出"兴趣案例",引起学生好奇心
作为教师,应让学生发自内心的有强烈的学习欲望去解决某类题目,如给学生的题目是:"求Fibonacci数列前50项(1,1,2,3,5,8,13,21......)"。Fibonacci数列本身是一个数学问题,学生一看到题目就会因为对Fibonacci数列的不了解而直接会产生抵触情绪,从而不想进一步去思考问题。但是我们可以把问题转化一下,将给学生的题目变为"古典兔子"问题:
"有一对兔子(一雌一雄),从出生后第三个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都存活,问每个月兔子总数为多少?"
这个例子对学生而言就不是简单枯燥的数学问题,而是有兴趣的"游戏"了,这会让学生在兴趣中主动学习,从思想层面接受这个新知识,进一步培养学生的递归思维意识。
步骤二:引导学生思考
在第一步骤中,教师提出了具体问题,学生会思考解决问题的方法。而在第二步骤中,教师可适当的为学生提供帮助,运用计算思维的各种方法启发学生,提供学习策略上的引导。
不妨分析一下:第一个月小兔子没有繁殖能力,所以还是一对;第三个月,生下一对小兔,一共有两对;第四个月,老兔子又生下一对,因为小兔子还没有繁殖能力,所以一共是三对,依次类推可以得到兔子的总对数构成的一个数列:
1,1,2,3,5,8,13,21......
可采用循环控制来解决问题,N-S流程图如下:
1.定义f1,f2为初始的兔子对数,i为控制循环输出的f1,f2的值,i<=25;
2.循环开始前,先输出f1,f2的初始值;
3.递推算法(正向思维):前两个月加起来赋值给第三个月。
到此,可建议学生采用计算思维中的逆向思维,从后往前推断。设函数f(n)为第n个月兔子的对数,若要求解f(n),必须先计算f(n-1)和f(n-2),即f(n)=f(n-1)+f(n-2)。而计算f(n-1),必须计算f(n-2)和f(n-3)。依次类推,直到计算第一个月的兔子对数f(1)为1和第二个月兔子对数f(2)也为1,。所以我们得到了第n个月兔子对数的递推的公式:
f(n)=f(n-1)+f(n-2)
而递推必须要有终止条件,即当月数值n为1或2时:
f(1)=f(2)=1
在回归阶段,当获得最简单情况的解后,逐级返回,依次得到稍复杂问题的解。在得到f(1)和f(2)后,逐级返回上一级主调函数可得到f(3),f(4),f(5),......,f(50)的值。此时学生已经掌握了Fibonacci数列的解决方法。
此例引导学生用逆向思维方法对问题进行求解,体会递归算法的思想过程,引导学生在思考中学习,并掌握递归方法。
步骤三:"举一反三",巩固教学成果
当学生掌握了递归算法之后,教师还应进一步启发学生的思维,让他们进行自主探究学习。教师应设计并提出该类问题的其它"兴趣案例",如典型的"汉诺塔"游戏,猴子吃桃等问题。让学生变被动为主动,消极为积极的去学习新知识,培养他们的自学能力,使其能够"举一反三",能够运用计算机思维解决所学专业领域问题的基本能力。
四、结语
"计算思维"是当今国际计算机界广泛关注的一个重要概念,也是当前计算机基础教育的重点研究课题。本文以《C++程序设计》中的"递归"算法例,阐述了"计算思维"在C++程序设计课程教学过程中对学生启发、递归式能力培养方法,使学生学会利用"计算思维"方式解决所学专业问题。
参考文献:
[1] Wing J M. Computational Thinking[J]. Communications of ACM, 2006, 49(3): 33-35.
[2]牟琴."轻游戏"对计算思维能力的培养[J].《远程教育杂志》,2011,6:94-101.
关键词:计算思维 程序设计 兴趣案例 逆向思维
【中图分类号】G633.67
2006年,美国卡内基梅隆大学(CMU)周以真(Jeannette M. Wing)教授在《Communications of the ACM》杂志上给出并定义了计算思维(Computational Thinking)的概念。周教授認为:"计算思维是运用计算机科学的基础概念进行问题求解、系统设计以及人类行为理解等涵盖计算机科学之广度的一系列思维活动[1]"。
一、计算思维的概念
随着计算机日益广泛而深刻的运用,计算这个原本专门的数学概念已经泛化到了人类的整个知识领域,并上升为一种极为普适的科学概念和哲学概念,成为人们认识事物、研究问题的一种新视角、新观念和新方法。
二、程序设计基础课程现状
2010年在西安的九校联盟会议上要求正确认识大学计算机基础教学的重要地位,要把培养学习者"计算思维"能力作为计算机基础教学的核心任务,并发表了《九校联盟(C9)计算机基础教学发展战略联合声明》,建设了更加完备的计算机基础课程体系和教学内容,为全国高校的计算机基础教学改革树立榜样[2]。这种计算思维能力可适用任何专业,这点已基本成为共识。但如何做?目前都还处于探索中。
目前,C++程序设计基础教学存在着一些问题:
1.教学内容多,学时少。授课教师难以做到对所有知识模块都有较深入的理解。因此对教师的授课水平提出了很高要求。
2.《C++程序设计》作为大学的第一门程序设计课程,知识点多,概念多,涉及大量的算法,对于没有任何程序设计基础的学生来说,掌握教学内容十分困难。
3."狭义工具论"认为教计算机基础就是教些计算机工具及其使用方法。教材基本上是有关领域的浓缩版,学生进入大学后,对计算机课程兴趣不大,逃课率相当高。
4.计算机基础课教学学时被压缩,教学资源配置不充分,课程面临被裁减的危机。
如何明确地将计算思维融入到课堂教学,以提高学生运用计算机知识抽象和分解问题的能力,是一个挑战。
三、教学模式的探索
"计算思维"有着极强的抽象性,通过什么样的方式才能培养学生的"计算思维"能力呢?根据C++程序设计课程教学的特点以及计算思维的学习技巧和方法,可采用"兴趣案例"分析的方式,运用教学模型进行程序设计课程教学,培养学生的计算思维能力,提高教学效率和学生学习效果,从而使学生掌握程序设计方法。
《C++程序设计》的最大特点是算法多,例如"递归"算法。"递归"这个概念本身非常抽象,因此教学过程中如果只是一味的强调概念,学生不可能有很好的理解。那么怎样才能让学生明白知识点的同时又培养其程序设计的"计算思维"能力呢?1
我们以求Fibonacci数列前50项为例说明计算思维在C++程序设计中的应用。我们设计三个步骤来完成"递归"思维能力的培养。
步骤一:提出"兴趣案例",引起学生好奇心
作为教师,应让学生发自内心的有强烈的学习欲望去解决某类题目,如给学生的题目是:"求Fibonacci数列前50项(1,1,2,3,5,8,13,21......)"。Fibonacci数列本身是一个数学问题,学生一看到题目就会因为对Fibonacci数列的不了解而直接会产生抵触情绪,从而不想进一步去思考问题。但是我们可以把问题转化一下,将给学生的题目变为"古典兔子"问题:
"有一对兔子(一雌一雄),从出生后第三个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都存活,问每个月兔子总数为多少?"
这个例子对学生而言就不是简单枯燥的数学问题,而是有兴趣的"游戏"了,这会让学生在兴趣中主动学习,从思想层面接受这个新知识,进一步培养学生的递归思维意识。
步骤二:引导学生思考
在第一步骤中,教师提出了具体问题,学生会思考解决问题的方法。而在第二步骤中,教师可适当的为学生提供帮助,运用计算思维的各种方法启发学生,提供学习策略上的引导。
不妨分析一下:第一个月小兔子没有繁殖能力,所以还是一对;第三个月,生下一对小兔,一共有两对;第四个月,老兔子又生下一对,因为小兔子还没有繁殖能力,所以一共是三对,依次类推可以得到兔子的总对数构成的一个数列:
1,1,2,3,5,8,13,21......
可采用循环控制来解决问题,N-S流程图如下:
1.定义f1,f2为初始的兔子对数,i为控制循环输出的f1,f2的值,i<=25;
2.循环开始前,先输出f1,f2的初始值;
3.递推算法(正向思维):前两个月加起来赋值给第三个月。
到此,可建议学生采用计算思维中的逆向思维,从后往前推断。设函数f(n)为第n个月兔子的对数,若要求解f(n),必须先计算f(n-1)和f(n-2),即f(n)=f(n-1)+f(n-2)。而计算f(n-1),必须计算f(n-2)和f(n-3)。依次类推,直到计算第一个月的兔子对数f(1)为1和第二个月兔子对数f(2)也为1,。所以我们得到了第n个月兔子对数的递推的公式:
f(n)=f(n-1)+f(n-2)
而递推必须要有终止条件,即当月数值n为1或2时:
f(1)=f(2)=1
在回归阶段,当获得最简单情况的解后,逐级返回,依次得到稍复杂问题的解。在得到f(1)和f(2)后,逐级返回上一级主调函数可得到f(3),f(4),f(5),......,f(50)的值。此时学生已经掌握了Fibonacci数列的解决方法。
此例引导学生用逆向思维方法对问题进行求解,体会递归算法的思想过程,引导学生在思考中学习,并掌握递归方法。
步骤三:"举一反三",巩固教学成果
当学生掌握了递归算法之后,教师还应进一步启发学生的思维,让他们进行自主探究学习。教师应设计并提出该类问题的其它"兴趣案例",如典型的"汉诺塔"游戏,猴子吃桃等问题。让学生变被动为主动,消极为积极的去学习新知识,培养他们的自学能力,使其能够"举一反三",能够运用计算机思维解决所学专业领域问题的基本能力。
四、结语
"计算思维"是当今国际计算机界广泛关注的一个重要概念,也是当前计算机基础教育的重点研究课题。本文以《C++程序设计》中的"递归"算法例,阐述了"计算思维"在C++程序设计课程教学过程中对学生启发、递归式能力培养方法,使学生学会利用"计算思维"方式解决所学专业问题。
参考文献:
[1] Wing J M. Computational Thinking[J]. Communications of ACM, 2006, 49(3): 33-35.
[2]牟琴."轻游戏"对计算思维能力的培养[J].《远程教育杂志》,2011,6:94-101.