1.1 认识计算思维
日常生活中的大小事,无疑都是在解决问题,只要涉及“解决问题”的事情,都可以套用计算思维来解决。读书与学习就是为了培养人们解决生活中遇到的问题的能力。计算思维是一种利用计算机逻辑来解决问题的思维,是一种能够将问题“抽象化”与“具体化”的能力,也是现代人应该具备的素养。
我们可以这样形容:“学程序设计不等于学计算思维,而程序设计的过程就是计算思维的一种表现;并且要掌握计算思维,程序设计是一个非常好的途径。”程序语言本质上只是一种工具,从来都不是掌握的重点,没有最好的程序语言,只有最适合的程序语言。学习程序语言的目标绝对不是要将每个学习者都训练成专业的程序设计师,而是要培养学习者的计算思维。
2006年美国卡内基梅隆大学的周以真(Jeannette M. Wing)教授首度提出了“计算思维”的概念,她提到计算思维是现代人的一种基本技能,所有人都应该积极学习。随后谷歌公司为教育者开发了一套计算思维课程。这套课程包括培养计算思维的4个方面——分解、模式识别、归纳与抽象化、算法。虽然这并不是培养计算思维的唯一方法,但是通过这4个方面,我们能更有效率地利用计算方法与工具来解决问题,进而建立计算思维。
1.1.1 分解
许多人在编写程序或解决问题时,往往会因为不知道从何分解问题而将问题想得太复杂。如果一个问题不进行分解,一般会较难解决。分解相当于将一个复杂的问题分成许多个小问题,先将这些小问题逐个击破;小问题全部解决之后,原本的复杂问题也就解决了。
我们以一个实际例子进行说明,假设有8幅很难画的图,我们可以将其分成两组各4幅画来完成;如果还是觉得太复杂,可以将其分成4组,每组各两幅画来完成,如图1.1所示。利用相同模式反复分解问题,这就是分治算法的核心精神。
图1.1
Tips
分治算法是一种很重要的算法,我们可以应用分治算法来逐一分解并解决复杂的问题。它的核心精神是将一个难以直接解决的大问题依照不同的概念分解成两个或更多个子问题,再逐个“击破”,分而治之。其实任何一个可以用程序求解的问题所需的计算时间都与其规模有关,问题的规模越小,越容易直接求解。
例如一台计算机出现故障了,如果将整台计算机逐步分解成较小的部分,对每个部分的各种元件进行检查,就容易找出问题所在;又如一位警察在思考如何破案时,也习惯将复杂的问题分成许多小问题。程序员遇到问题时,通常会考虑所有的可能性,把问题逐步分解后进行解决,久而久之,这样的逻辑就变成了他的思考模式。
1.1.2 模式识别
将一个复杂的问题分解之后,我们常常能发现小问题之间的共有属性及相似之处,在计算思维中,这些属性称为“模式”。模式识别是指在一堆数据中找出特征或规则,并将其作为对数据进行辨识与分类决策的判断依据。在解决问题的过程中,找到模式非常重要,因为模式可以简化问题。当问题存在共通模式时,它们就很容易被解决。因为当共通模式存在时,我们可以用相同的方法去解决这类问题。
例如画出一只狗之后,我们可以依照这一模式轻易地画出其他狗,狗都有眼睛、尾巴与4只脚,唯一不一样的地方是每只狗都有或多或少的独特之处。辨别出模式之后,便可用此模式来解决不同的问题。因为我们知道基本上所有的狗都有这些属性,当想要画狗的时候便可将这些共有属性加入,然后就可以很快地画出很多只狗。
1.1.3 归纳与抽象化
归纳与抽象化在于过滤和忽略掉不必要的特征,让我们可以把注意力集中在重要的特征上,将问题具体化。通常我们会在这个过程开始时收集许多的数据,然后通过归纳与抽象化,把特性和无法帮助解决问题的模式去掉,留下相关和重要的共有属性,直到建立起一个通用的问题解决规则。
“抽象化”没有固定的模式,它会随着需求或实际情况的不同而有所不同。例如把一辆汽车抽象化时,每个人都有各自的分解方式,汽车销售员与汽车维修师对汽车抽象化的结果可能就会有如下差异。
汽车销售员:轮子、引擎、方向盘、刹车、底盘。
汽车维修师:引擎系统、底盘系统、传动系统、刹车系统、悬吊系统。
1.1.4 算法
算法是计算思维4个基石的最后一个,它不仅是人类利用计算机解决问题的技巧之一,还是程序设计领域中的关键,常常被作为设计计算机程序的第一步。算法就是一种计划,每一个指示与步骤都是计划过的,这个计划里面包含解决问题的每一个指示与步骤。
日常生活中也有许多工作都可以利用算法来描述,例如员工的工作报告、宠物的饲养过程、厨师准备美食的食谱、学生的课表等,甚至连我们平时经常使用的搜索引擎都必须通过不断更新算法来运行。
《韦氏词典》中将算法定义为“在有限步骤内解决数学问题的程序”。如果运用在计算机领域中,我们可以把算法定义成“为了解决某一个工作或问题,所需要的有限数目的机械性或重复性指令与计算步骤”。在计算机里,算法更是不可或缺的一环。接下来说明算法所必须具有的5项特征,如表1.1所示。
表1.1
接着还要思考用什么方法来表达算法最为适当。其实算法的主要目的是让人们阅读了解所执行的工作流程与步骤,学习如何解决问题,只要能够清楚表现算法的5项特征即可。
常用的算法表示法可以是一般文字叙述,如中文、英文、数字等,特点是使用文字或语言叙述来说明演算步骤;有些算法则是利用可读性高的高级程序语言(如Python、C语言、C++、Java等)与虚拟语言来表达。
Tips
虚拟语言接近高级程序语言的写法,是一种不能直接放进计算机中执行的语言。虚拟语言一般都需要一种特定的前置处理器,或者需要通过手动操作来将其转换成真正的计算机语言,经常使用的虚拟语言有SPARKS、Pascal-like等。
流程图也是一种相当通用的算法表示方法,必须使用某些图形符号。为了实现流程图的可读性和一致性,目前美国国家标准学会(American National Standards Institute,ANSI)制定了统一的图形符号。表1.2所示为一些常见的流程图符号。
表1.2
例如输入一个数值,并判别该数值是奇数还是偶数的流程图,如图1.2所示。
图1.2
Tips
算法和程序有一些不同,因为程序不一定要满足有限性的要求,如作业系统或机器上的运行程序。除非关机,否则它们永远在等待循环,这也违反了算法5项特征中的“有限性”。