马 波
(浙江省余姚市姚北实验学校,浙江余姚315480)
2010年7月,教育部高等学校计算机基础课程教学指导委员会在西安的会议上发布了《九校联盟(C9)计算机基础教学发展战略联合声明》,确定了计算机基础课程的教学改革,此次教学改革是以计算思维为核心的。在初中阶段的信息技术课程,教师不应再将授课的重点放在计算机相关知识和软件操作应用上,应以培养学生的信息素养为核心,而初中生的信息素养又尤以计算思维能力为重中之重。
在长期的程序设计教学中,笔者一直非常注重培养学生的算法思维,认为算法思维是一种解决问题的过程性思维方式:算法思维就是能清楚说明问题解决的方法,能够将一个复杂的问题转化成若干子问题并将其进一步简化,以达到解决问题的目的,这也是科学和设计领域的一项重要技能;算法思维就是能清楚地理解问题解决的规则,能够认识到问题的起点、边界和限定范围,按部就班地完成任务或解决问题;算法思维就是能清楚地分析问题解决方法的优劣,能够设计与构造操作步骤更少、更经济的算法。
通过算法和程序设计的学习,学生可以体验解决问题的过程,以及人与计算机共存的思维特征。但是,算法思维是以算法为出发点,相比以计算理论出发的计算思维,有更多的局限性。因此,计算思维有利于推进信息技术课程在学科思维方面的研究,有利于学生通过信息技术课程获得终身有用的知识与能力,而不是面临过时的计算机操作步骤。
计算思维这一概念的提出,最早是在2006年3月周以真教授提出的。周教授认为,计算思维是运用计算机科学的基础概念进行问题求解、系统设计、以及人类行为理解等涵盖计算机科学之广度的一系列思维活动[1]。根据周教授的观点,计算思维就是通过简略、融入、转换和仿真的方法把一个看起来比较困难的问题重新解释成一个人们知道用什么方法解决的问题,计算思维与人们的日常生活及工作密切相关,应为人类不可或缺的一种能力。此概念的提出,引起了学术界广大学者的热烈讨论,分别对计算思维有着不同的解读阐释。
Google最近的课程建设成果里面推出了面向教师的计算思维课程,旨在协助教育工作者学习计算思维(CT:Computational Thinking),了解它与计算机科学的区别,以及理解如何将其整合到不同的学科中[2]。Google认为计算思维的基本要素如下:
“分解”:把数据、过程或问题分解成更小的、易于管理或解决的部分
“模式识别”:观察数据的模式、趋势和规律
“抽象”:识别模式形成背后的一般原理
“算法开发”:为解决某一类问题撰写一系列详细的指令
从以上对计算思维的概念和要素中可以看出,计算思维不是对计算机的思考,也不是要求人类像计算机那样思维。因为计算机本身并没有思维,是人类在计算求解问题的过程中赋予计算机的人的思维。因此计算思维只是一种人的思维,应在平时教学中要多采用思维启发式教学,引导和关注思维走向,通过内容的教学来培养计算思维,运用到日常的学习生活中,来解决实际遇到的问题,因此它是人人都需要的一种思维方式。
在一般的程序设计教学中,大家都非常注重培养学生的算法思维,课堂比较注重算法的概念和应用,强调解决问题的方法和步骤[3]。其实,在算法思维学习中已经培养了大部分的计算思维,例如“抽象”和“算法开发”。那么如何提高学生的“分解”和“模式识别”能力呢?这就是问题分析能力,如果在课堂中更加注重问题的分析和讨论,强调解题算法是怎么诞生的,在无形之中学生的计算思维能力就能全面提高,课堂自然而然也从注重培养算法思维提升到注重培养计算思维。
下面,以程序设计课程中的博弈问题教学为例,来谈谈计算思维培养的具体策略和方法。
博弈问题:给你2n个数字,放在一行的格子上。下面你跟同学玩取数字游戏,两个人轮流取,每次只能取最左边或者最右边的数,最后每人都能取到n个数字,请问谁取的数字之和最大。两个人都是很聪明的,都会用最优策略尽量保证自己能够赢。
假如你先取,你有没有必胜策略呢?
1353768413
例如:上面格子中的10个数字,你怎么取,才能保证自己一定胜利呢?
“分解“就是把数据、过程或问题分解成更小的、易于管理或解决的部分。其实类似于数学中的数学归纳法。要举几个小规模的问题例子,去分析和解决问题,以小见大,得出问题的一般规律。
许多学生一看到这样一道问题,往往没有思路,无从下手。“分解”就是给了一个下手的办法。
问题规模 问题解决办法2个数字3 5我取右边的数字5就胜利了,4个数字1 2 7 5我取左边的数字1,再取数字7就胜利了第一个取的是左边14个数字1 2 4 4我取右边的数字4,再取数字2就胜利了第一个取的是右边46个数字1 2 3 4 6 5我能取到2+4+5=11我第一个取的是右边5…
学生们可以列一张表格,不断的变化问题并计算得到答案。
在此环节中,学生在填写表格的同时,启发学生思考,将一个复杂的大问题变成了小规模问题。以这样的形式进行教学,在无形中引导学生自己处理问题的时候也应将复杂问题细化、简单化,长而久之,形成分解的计算思维能力。
“模式识别“就是观察数据的模式、趋势和规律。
就跟做实验一样,上面是实验过程,下面要统计数据,发现规律。
同学们在大量的小规模问题中,就会发现其实有一种取数的策略是你可以控制的。
第1个数一定是奇数位置,最后1个数一定是偶数位置。
取法1:
你如果第1次取走了奇数位置上的数,那么对手只能面对偶数位置上的数。
这样你就可以一直取走奇数位置上的数,逼迫对手只能取得偶数位置上的数。
取法2:
你如果第1次取走了偶数位置上的数,那么对手只能面对奇数位置上的数。
这样你就可以一直取走偶数位置上的数,逼迫对手只能取得奇位置上的数。
所以最后的答案就是你可以先把奇数位置上的数都累加起来,和设为s1.
把偶数位置上的数也累加起来,和设为s2。
然后根据s1和s2的大小来决定你是准备取奇数位置还是取偶数位置。
在此环节中,重点培养学生的观察力和数学归纳能力,有的学生经过长时间的模式练习后,能够很快的发现新问题的内在规律。
“抽象”就是识别模式形成背后的一般原理。
“抽象”更多的是提炼出规律,把问题数学化、数字化。
例如上面那个博弈问题,本来问题很难,现在被抽象成一个数学问题。
给你2n个数字,请你求出奇数位置上的n个数字之和,以及偶数位置上的n个数字之和。
抽象要求学生有比较好的数学基础,在这个过程中能够培养学生的数学建模思想。当学生把一个具体问题抽象化后,接下来就是围绕这个数学问题进行展开,运用算法思维进行算法设计。
“算法开发”就是为解决某一类问题撰写一系列详细的指令。可以先让学生写成解决问题的算法,也就是方法和步骤。既可以用文字描述过程,也可以用流程图描述过程,最后把算法翻译成你会的某一门计算机语言。
下面,就上面的“抽象”后的问题进行算法设计。
1、用文字描述该问题的算法如下:
(1)输入2n个数字到数组a[];
(2)设两个累加器s1=0和s2=0;
(3)求出n个奇数位上的数字之和放入s1中;
(4)求出n个偶数位上的数字之和放入s2中;
(5)如果s1>s2,那么,第1次就取第1个数,后面每次都取奇数位上的数字。反之,第1次就取最后1个数,后面每次都取偶数位上的数字。
2、用pascal语言代码实现如下:
Var n,i,s1,s2:longint;
a:array[1..1000]of longint;
Begin
Readln(n);
For i:=1 to 2*n do read(a[i]);
S1:=0;s2:=0;
For i:=1 to 2*n do
Begin
If (i mod 2=0) then s2:=s2+a[i] else s1:=s1+a[i];
End;
//输出第1次取那一个数。
If s1>s2 thenwriteln(1)
Else writeln(2*n);
End.
从上述的这节博弈问题的教学设计实例来看,基于培养学生的计算思维来设计整堂课的教学活动,能让学生知其然知其所以然,可以更好地掌握解决问题的一般方法,为以后举一反三、触类旁通打下基础。例如,通过“分解”的方法对问题进行分析和解决;通过“模式识别”的方法对上述的“分解“结果进行观察、归纳、总结;通过“抽象”的方法将问题进行简化、数学化、一般化;通过“算法开发”的方法运用算法思维将“抽象”的问题进行分步解决。在这节课中,充分挖掘出程序设计中所蕴含的计算思维相关内容,让学生理解与掌握信息技术相关知识与技能的同时,更培养了学生的计算思维。
对于计算思维来讲,要成为一门学科,还有很长的路要走。目前,计算思维还不是知识形态的学科,因为其本身的概念、原理、特征、培养方法论以及创新方法论等方面的知识体系并未形成。因此,计算思维学科体系的建立任重而道远。
在程序设计课程中,可以从算法思维的培养延伸到计算思维的培养,那么其他课程呢?
在常规信息技术教学中,其实不仅仅程序设计这个模块可以培养学生的计算思维能力,其他的模块同样也可以。教师必须首先深刻理解计算思维的内涵和本质,掌握计算思维的四个基本特征:“分解“、“模式识别”、”抽象”、“算法开发”。从过去的单纯教授学生知识转变为教授学生思维方法和能力,这样才能将计算思维贯穿到信息技术课程教学中去。长此以往,在潜移默化中学生的计算思维能力一定能得到提高。