龙空技术网

生活算法 (一) 思维

王小乐耶 221

前言:

当前咱们对“高精度算法阶乘”可能比较珍视,我们都需要了解一些“高精度算法阶乘”的相关资讯。那么小编在网上网罗了一些有关“高精度算法阶乘””的相关内容,希望同学们能喜欢,大家一起来了解一下吧!

武健 北京东城区东四九条小学

2014年11月

为何要有“生活算法”一说

何为“生活算法”?

生活能否计算?

如何学习生活算法

  从细节到算法

  从算法中得到算法

信息技术课中的生活算法

  操作教学

  主题教学

生活算法的局限

工具、方法与生活算法

信息科技视角下的生活算法

序言:十年 拾年

“生活算法”一说,已有十年了。常说十年一剑。不过这把剑麿的并不特别紧,至此也就一铁条而已。只是时间上到了需要反思、总结的节点了。以前的东西梳理一下是必要的。

2003年提出“生活算法”是因为对信息技术课有很多困惑。憋了很久,在偶然的机会灵光一闪。2004年3月在《信息技术教育》杂志发表了第一篇文章:《生活中的算法,算法中的生活——谈信息技术教学中的“生活算法”》。之后,2005年8月《信息技术教学名词辨析-信息技术课中的生活算法》,2007年5月《从生活算法中审视程序设计算法》……,陆续写出了一些。直接的文章有五、六篇吧,相关的有十余篇。但整体感到体系化不足,没有能够完整地表达一些想法。

初提“生活算法”时,心里总是不踏实。一线小学教师要立说,真有些狂妄了。于是小心翼翼地求证。支持者、反对者均有,并且争议很大。其中有提出以奥卡姆剃刀原则-非必要勿增实体的。也有认为非算法而实为生活策略的……,对师长、朋友的观点深以为然。因此几番停滞,几近放弃。不过,又再次被教学实践所困,只好几番重提。几番反复花费了不少时间。发展的曲折同时说明此说有一定解释力的。

我认为“生活算法”并不是标准的学术术语,更多地是一种生活化的词汇。与很多朋友的看法不同,我认为其中最有价值的是“生活”,生活才是技术类课程的真正核心,需要从生活中来,到生活中去。然后是“算法”,是以规律为基础的行动规则。

很长一段时间,自己很羞涩。“生活算法”太具有个人特征,自己也感到不好意思讲解。一线教师不是研究人员,研究远没有达到完善的程度。不过,如果真正理解名利,经过长时间检验的东西为什么不拿出来与大家分享呢?这样的十年,经历了这样的春秋。到现在,“生活算法”仍像路边的野花一样,默默地成长,默默地开放。正是我的期待,不急不燥.不偏不倚,发挥自己的作用就可以了。

一、为何要有“生活算法”一说

发表于《中国信息技术教育》2014/3月,总 182 期

(一)经历

从个人的经历来说,勉强可以算是程序员出身了。1987年就开始用计算机了,第一次接触的是Laser-310。为了准备全国师范院校的计算机程序设计比赛,我被选派参加了集训队。这才学会for-to, if-then等命令,同时还学会了高精度计算、阶乘等不同的算法。虽然最终比赛最终没有如期举办,但我收获很大。在活动中体会到了计算机程序、算法的魅力,好程序可以完成很多原来不能想象的事情。

1989年开始当教师教起了计算机课。当时的以中华学习机为主的计算机中只有固化的编程语言,不会语言就不能使用计算机。先是BASIC语言,然后是LOGO语言。在八、九年的编程教学中,慢慢地体会到了编程教学是有不同层次的。

一种层次是“命令”的教学,也就是主要目标是计算机的语句、命令。前苏联学者伊尔肖夫说过:“计算机程序设计语言是第二文化”。计算机开机后只有BASIC、LOGO语言,那么教学的主要内容就是学会编程的命令和语句。第二种层次是“程序设计”的教学。也就是教学的主要目标是程序设计。学会了命令、语句以便设计程序。而程序设计的核心是算法。因此,在教学中如何强调算法成了计算机课堂教学自然而然的事情了。

另一种层次是“思维”的教学。经历多年的程序设计中渐渐地体会到:真正的大师善于从思维中把握算法的核心,用计算机实现一种算法首先是一种思维的实现。因此,在计算机课的学习中更重要的内容成了如何渗透算法思维,如何将思维融合于生活中,而不是掌握某一种或几种固定的“算法”。

“命令-算法-思维”三级目标对于一个成长中的计算机/信息技术教师来说有着重大的影响。在工作、生活中寻找.形成解决问题的“算法”逐渐形成了一种思维方式,一种程序员的思维方式。

当我们手里有一只锤子时,最喜欢的是把世界上所有的东西看成钉子。都愿意用手中锤子去试一试身边的生活。感受到了算法的好处,也会经常倾向把算法思想广泛地应用到各类问题,而信息技术课中就恰恰有这样的问题,并且还不少。

(二)体会

1999年前后,课程名称改为“信息技术”,教学内容由程序设计逐步改为计算机操作,算法渐渐淡出。课堂教学转变成以office办公软件的操作为主的教学活动。今天看来,这种变化是课程经历的新一轮的螺旋上升过程。不过,经历了一轮实践后,许多信息技术教师又重提“老”问题:信息技术课仅仅是教会学生掌握软件操作吗?

当我们对计算机教学中的诸概念追根溯源,从认知心理学中角度分析所谓的“操作”。可以发现“简单操作”也是由一个个更细微的动作按一定次序组成。更复杂的问题解决步骤往往是由更细节.更具体的下一级解决方法组成。这其中的“次序”与程序非常类似。在程序员眼中,计算机的操作与程序设计是在一定方面是相互对应着的。

其中程序设计中的命令、语句对应着计算机中的操作、方法与技巧。都是相对具体的,对比整体都是“更微小”的,是组成后续要素的基础。程序对应着操作工具、解决问题的过程与步骤。都是强调有一定的次序性。程序设计算法对应着技术应用的“算法”。程序设计中的“思维”对应着技术应用的最终目标~问题解决。如果把前面的称为计算机程序设计算法,后面的这一种,为了应用技术、操作工具来解决生活中的问题而出现的行动规则称之为“生活算法”。

两种不同情境下的“算法”既有很多相似,也存在着很多不同。

两者都有算法思维的特点,两者都有模块化特征;两者都需要有可行性,计算机算法需要能编程实现,生活算法需要生活中能一步步实施;两者都是由抽象到具体的,程序设计算法是按照“算法-程序-命令”逐级分开。生活算法是可以按“算法-过程-操作”逐级展开。学习程序设计算法需要从程序入手,掌握生活算法也需要从解决问题的过程.步骤入手,基础都是有程序性。

也可以看到两者有更多的不同。程序设计算法是直指程序设计的,最终能够编程在计算机上实现的。生活算法直指使用工具解决问题的,需要一步步在生活中去真正地解决某个问题;程序设计算法可以使用某种计算机语言,或者伪代码.流程图来表达。但针对技术工具的生活算法更倾向于人的自然语言表达;程序设计算法相对严谨.抽象,生活算法相对宽松,但针对不同的问题情境会有不同变化。

……

(三)效果

当我们在反复辨析“生活算法”与程序设计算法到底是不是同一个概念的时候,却发现这种解释对于信息技术课来说,是一种有意思的思考。因为有了“生活算法”,现在的信息技术课中一些所谓不相关的部分联系到了一体。

以算法为桥梁,理解信息技术课应用软件部分与程序设计之间的关系在中.小学信息技术课的主要内容,象画图程序.字处理Word、wps、多媒体ppt、flash等不同应用软件的学习,除了部分特有概念外,都是从单击、双击、保存、打开等简单操作开始的。若干简单操作组成了操作方法,再由操作方法逐步复杂化,向利用工具解决问题发展。从简单操作到方法,从操作步骤到程序,从过程到应用工具的行动规则~算法,再到问题解决。形成了操作工具的“生活算法”系列。对应着的就是更抽象的.程序设计中的“命令-程序-算法”体系。

从生活算法的角度来看,现有的教学内容其实是一个有结构的整体。无论是软件应用部分强调其操作性.程序性,还是计算机编程方面强调程序设计.强调算法,都是在培养学习者的思维能力.问题解决能力。

程序设计算法-生活算法。是面对着钉子时,我们手中的锤子呢,还是一块砖头?或者它们都一样?

二、何为“生活算法”?

发表于《中国信息技术教育》2014/4月,总 184 期

(一)缘起

“算法”一词是在数学界提出的。

“算法”的中文最早出现在中国汉代的数学名著《周髀算经》中。《周髀算经》卷上有:“数之法出于圆方。圆出于方,方出于矩。矩出于九九八十一”。意思是:算数的方法都出于对圆.对方的计算,其中圆出于方(圆形面积=外接正方形*圆周率/4),方出于矩(正方形源自两边相等的矩),矩的计算出于九九八十一(长乘宽面积的计算依自九九乘法表)。

“算法”的英文是Algorithm,来自于9世纪波斯数学家穆罕穆德·宾·穆沙·阿尔·花剌子密(MuhammadbinMusaal-Khuwarazmi,又译花剌子模)一本著作的名称。原来为“algorism”,意思是阿拉伯数字的运算法则,在18世纪逐渐演变成为"algorithm"。算法随着阿拉伯数字一起传播到了世界范围。

在数学中,也会经常提到“算法”。

算法一般是指计算的方法.运算的法则。例如,要计算18+19得多少?有许多种算法的。可以先算8+9,然后再加上20;也可以先算19+8,然后再加上10;还可以先用18+2,然后再加上17……。学习数学的过程中,掌握的算法越多,数学思维就会越清晰。

在计算机学科中也经常会提到“算法”一词。

诗人拜伦的女儿AdaByron(艾达·拜伦)是世界上公认的第一位程序员。在1842年为巴贝奇分析机编写求解解伯努利方程的程序时就提出了关于算法的问题。计算机中的算法是指利用计算机在有限步骤内求解某一问题所使用的一组定义明确的规则。通俗地说,就是计算机解题的过程,是解决问题的方法与步骤。在这个过程里,无论是形成解题思路还是编写程序,都是在实施算法。所以前者是推理实现的算法,后者是操作实现的算法。

与数学中的存在性证明还是有些不同的。数学中的存在性证明是一种理性的承认。希尔伯特曾经在给学生讲到存在性证明时,举过一个例子:“这个班里一定存在一个学生,他的头发数最少,可是我们不可能知道他是谁”。而计算机需要则需要落实到每一件工作.每一个步骤,例如,计算一个函数值,求解一个方程,证明一个结果等等。需要有一个清晰的思路,一步一步地去完成,这就是算法的思想,程序化的思想。

所谓算法思想,就是指按照一定的步骤,一步一步去解决某个问题的程序化思想。正是其步骤性.程序性使得能够在计算机上得以完成。计算机解决任何问题,必须将解决问题的过程分解为若干明确的步骤(即算法),并用计算机能够接受的“语言”准确的描述出来。算法是计算机科学的重要基础,没有算法也就没有计算机。

(二)生活算法

在计算机普及的时代,程序设计人员日益增多。程序化越来越为人们普遍接受、认可算法在社会中变得越来越明确、重要。对照着生活,人们发现以前虽然没有直接用“算法”一词,但一直在使用着算法的思想:即使自己在面对一些不足道的日常小事时,也会想出很多种解决方法,提出不同的解决过程,有着不同的最终结果。在这些解决生活的方法与步骤中存在着背后的规律与一般性的行动规则。

例:生活中问题-老李家住东直门,周六要去王府井书店买书。刚要出门,爱人又要他到附近的菜店买点菜回家,好做中午饭。听话的老李会怎么办呢?

生活中的事情,往往会有很多不同的解决方法。老李可以:

〖方案一〗:从家出来,直奔附近的菜店买菜,然后提着菜直奔书店买书。之后拿着书与菜回家。

评述:怎么会这样?提着装满菜的菜篮子进书店,这种人真是少见呀!〖方案二〗:先到书店买书,然后提着书到家附近的菜店买了菜再回家

评述:可能是一种省力的方案,书毕竟便于携带一些。不过,都是这样吗?会不会带着沉重的百科全书,然后与菜店的小贩们讨价还价?〖方案三〗:先去附近的菜店买菜。送回家后再去书店买书。

评价与分析:这是与家人协作的一种方法。家里的人在做饭,老李先去买菜。先把菜送回家,再到书店自由自在地挑书。等回家了,饭也做好了。不过,这种方法可是要多走好些路,多不少花时间的呀。〖方案四〗……

生活中会有许多的类似“买书与买菜”的问题。面对问题时会有很多种解决方法,同时个人会根据环境条件.个人偏好等原则与标准选择方法.方案;在不同环境.方法下会有着不同的结果……。

如果按时间维度,把生活中解决问题的方法与步骤看成一个个“程序”,那么针对解决生活问题的方法而形成的行动规则与套路,就可以看成“算法”。在方法与步骤的基础上,面向生活中问题解决的“算法”,就是生活算法。

(三)特点

用生活算法的思路来反思我们的生活,可以发现:我们随时遇到类似的生活问题:早晨上班前发现车子坏了,自己要怎么办?如何办理自己家里的电话移机?把手洗干净的步骤是什么?一组同学如何配合把教室打扫干净……。

需要关注问题解决背后的生活算法面对这样或者那样的问题都会有许多种办法,有人选择这样的方法,也有人选择那样的方法;同一个问题会有着多种解决方法,即使不恰当的方法也是方法;同一种方法甚至会产生不同的结果,即使不能解决的问题也有最终结果……。在生活中,每个人随时都需要决策,每个人都在不同程度上关注的方法与步骤。如果还能够更深入,还会继续问下去:它们是如何产生的?是否存在着一般性的行动规则?我们是根据什么因素在各种不同方法与过程中择优?……这些都是生活算法特别关注的范畴。

明确的算法可能对解决当前具体事物没有直接作用。但在更广的范围内会有明显作用,尤其是在应用工具.技术解决相对复杂的问题时会更加典型和突出。

因为,生活算法需要预先设计出解决问题的方案;需要对各种不同方案进行筛选;需要根据现有的条件对解决的方案进行分析与优化……。也许生活中不存在最优算法,但在诸多方案中存在着一种或多种更好的。这就是在进行着生活算法设计与优化的过程。在“买菜与买书”中,老李有了目标就可以提出不同的解决方法与步骤,可以根据省时或者省力等不同的标准,在不同的解决方案中选择自己最适合的一种。这是在规划算法。

对人的认知来说,生活中的“简单”问题往往很“复杂”。许多简单的事情,在不同的环境中会有不同的要求,往往会有更多的限制条件。条件不同,即使相同的事情也会有着不同的解决方法。越接近生活实际,限制的条件会越多,就会越难抉择。这往往需要我们列举的各种不同的解决方法,根据具体情况,通过列举、对比、分析最终找出最恰当,在具体实施中不断修正来达到最佳的效果。这就是在应用中实施生活算法。

面对着生活中的问题,每个人都会首先从自己的视角来思考,得到不同的.可能的解决方案。在具体实施过程中,当遇到简便、合适的方法时就使用;遇到繁杂、不合适的方法就寻求变化,不固执地使用某一种方法。这也是一种选择方法的准则:遇到繁杂而不方便的方法就需要寻求变化,找到一种简便.恰当的方法。前者是推理实现的生活算法,后者是操作实现的生活算法。

如果能够更早地把这些方法教给孩子们,帮助他们能够更独立地面对生活问题,帮助他们去寻找这些方法与步骤背后规律与规则,帮助他们在使用信息技术中善于归纳、推理、选择……,对于信息技术课程而言是相当重要的。

参考资料:

·对“圆出于方”解释的探析 袁思情 李俊 《小学教学·数学版》2010.06 P46

三、生活能否计算?

发表于《中国信息技术教育》2014/5 月,总 186 期

(一)计算生活

生活能够“计算”吗?这个问题如果能够展开,会出现很多类似的困惑。如,人的感情能计算吗?人际关系能计算吗?直觉能计算吗?人生能计算吗?……。

计算:如果是指以狭义的数字的方法来运算生活中的每一件事情。以现状看,

这会比较困难的。不过“计算”的含义不仅是数学概念,在字典中列出的有:⑴通过数学方法根据已知数求得未知数。⑵考虑;筹划。⑶暗中谋划(《现代汉语学习词典》 商务印书馆辞书研究中心编 第 576 页,“计算”条 ISBN 978-7-100-07102-4)。后两种意思更广泛一些。

面对生活、面对问题的思考与筹划是每个人都会有的。在许多简单问题面前,我们可能会占用的思维很少,挥手之间就能拿定主意;面对复杂的问题,可能需要反复斟酌,思考再思考,在深思熟虑后才能拿定主意……。问题解决,需要人的思维,需要有一定的思考。

每个人在思考时,都是在尽力发掘事物背后的规律,寻求相应的行动规则和准则,提出可行的解决方法与步骤。人们会根据自己理解、规定和认识,把握与描述事物的规律,从事物的结构、关系、程序为主要目标,得到最终的方法。面对问题时,很多人习惯从解决问题的具体方法与手段入手,首先考虑如何把问题解决了。第一位想的是方法与手段,尤其是以前不曾遇到过的新问题时,更加关心自己的解决方法。当我们在积累了若干经验后,再遇到类似的问题时,会逐步升级,关注到方法.步骤背后存在的一般性的规律和规则了。在生活中,如果我们超越了解决方法与步骤,就开始进入到熟练状态,从茫然无知的新手状态逐步开始过渡到轻车熟路的熟练状态。如何缩短这个过程,是人生中的大问题。

将诸多小事中的行动规则明确出来,有助于以后的活动。缩短从生手到精通的过程,这也是生活算法的作用与意义。

(二)形式

生活算法是一种形式的行动规则。人们发现任何复杂的算法都可以由顺序结构、分支(选择)结构和循环结构这三种基本结构组成。因此,我们构造一个算法的时候,也仅以这三种基本结构作为“建筑单元”。用这样的“建筑单元”就可以把复杂的问题变得简单化。

正因为整个算法都是由三种基本结构组成的,就像用模块构建的一样。所以结构清晰,易于正确性验证,易于纠错,这种方法就是结构化的设计方法。

1.算法的顺序结构

顺序就是按照一定的次序,一步步地解决问题。例如,每天早晨起床前后的活动是:

在顺序结构中,有些环节是可以改变前后次序的,而有些环节则必须按次序执行。如“刷牙”和“洗脸”两个环节,是可以改变先后次序的。可以先刷牙,然后再洗脸。也可以先洗脸.然后刷牙。但是“起床”.“上学”两个环节中必然是先“起床”,后“上学”。生活中是不会出现先“上学”,后“起床”的。

顺序是最基本的算法形式。

2.分支结构

一部分问题在不同的条件下会有着不同的解决步骤和方法,这就是分支结构。在生活中的“选择”.“判断”都是典型的分支结构。

例如:打算明天去公园玩,但如果天气不好,那只好在家中看电视。这个过程可以表示成为下图。

分支是人重要的思维模式之一。

3.循环结构

由于没有达到条件而不停地重复做同一事情,这样的过程就是一种循环结构。在现实生活中,我们也经常会碰到这样的事情。

例如:在跳绳测试中,会以时间为限。还没有到时间之前,需要不停地跳下去。

在算法中,顺序结构.条件分支结构.循环结构并不彼此孤立。三种基本结构既可以并列,也可以相互包含,在循环中常常伴有条件分支和顺序结构,条件分支结构中也常常伴有循环和顺序结构。正是这三种基本结构按照不同的结构组成了不同的算法。

4.模块化的基本思路

算法经常是环环相扣的模块化的结构。模块化其实就是把一个大的问题按一定的分类方式分成若干个小问题,直到问题被分解到最简单.最单一的结构,就好像是搭积木一样。

例如:前面所说的起床后的活动,可以分为起床、刷牙、洗脸、吃饭、上学几个顺序,这样就把一个复杂的程序分解成为若干个相对简单一些的部分了。如果需要再进一步的细化,那么我们就要把这些列举出来的部分再进一步细分。

例如:可将洗脸这一个部分再分解为下列几个动作序列:1.拿毛巾;2.洗毛巾;3.拧干毛巾;4.擦脸;5.洗毛巾;6.拧干毛巾;7.放毛巾。

有了生活算法的顺序、分支、循环三种基本结构,根据从顶及底的设计思路,利用模块化的设计方法就可以分析与设计生活中的算法。

这样设计出来的解决方案将会是从全局的角度来思考的、整体的解决方案。

(三)关系

生活算法是以算法的视角来反思生活中的问题解决,它直接面对生活中的诸多大、小事宜,与程序设计中的算法既有相似也有不同。

与计算机的“程序-算法“的过程类似,生活算法强调“过程-算法”。一般需要从程序、过程中归纳.、总结算法,再用算法来指导计算机程序、问题解决过程。它们共同具备算法的五个重要特征:1有穷性:都必须保证执行有限步局之后结束;2.确切性:每一步骤必须有确切的定义,不能有无法操作的二义性;3.输入:有0个或多个输入;4.输出:对计算机来说会有一个或多个输出,对于生活算法来说会有一个或多个结果。5.可行性:原则上能够精确地运行。程序可以在计算机上去执行,过程需要能在生活中能够一步步地落实。

同时,生活算法与程序设计算法也有很多不同:呈现形式不同。计算机算法是以计算机程序、伪代码、流程图等为主要形式表现;生活算法因其面向生活,因此以自然语言、图表、流程图等为主要表现形式。面对的范畴不同。计算机算法是面对利用计算机解决问题。生活算法面对生活,是人在生活中解决问题的。实施对象不同。程序设计算法的主体是计算机。最终编写的程序将在计算机得以运行。生活算法的实施主体是人,生活算法所表现的方法与步骤将在生活中一步步地落实。计算机有计算机的特点,人有人的特点。

对于信息技术课来说,如果能从“生活算法”的角度来审视现行课程的内容。在中小学是以发现计算机的操作.使用计算机解决问题的为主的,如画图软件、Word、PowerPoint等。这些计算机操作、技术应用型的课程都能以算法的思路来重新整理其教学目标。工具软件的操作、应用强调其问题解决的方法与步骤,其背后的生活算法是程序算法的具体映射。计算机课中的编程部分与软件操作部分实际上成为了一个整体关系。

从这个角度看,信息技术课程现有的内容实际上是一个有结构的整体。

其中画图、word、PowerPoint、flash,甚至包括Excel等等软件的操作均有过程-算法的含义,而应用软件的问题解决背后也有生活算法,也是算法思想的具体落实。其中程序设计的算法是更抽象的,而生活算法相对更具体、更情境化。

(待续)

生活算法(连载之二)

生活算法(连载之三)

标签: #高精度算法阶乘