秋天栖息在农家里。向江面的冷雾撒下圆圆的网, 收起青鳊鱼似的乌桕叶的影子。
——模板自语
选模板时,没舍得删上句,觉得有意境,有禅理。最近再深学计算思维,感觉这句可对照一下还是大有裨益的。
后台有老师意思是最近发的内容太少,貌似有些应付工事,其实不是的,误会我了,我最近想精致点发,与大家深刻点读。
就计算思维来说,已经到了圣~经~圣~语~的地位,然我们还是不十分明确。如果想学习它还是要慢慢的学习、慢慢的探寻。其实,有时候我们也别太急,一学期甚至一学年真能做一件深刻的事,就极好了!君可知,有些很想成功,很爱学习,可是每次都是囫囵吞枣,或者总是是急就章,过去一年又一年,进步并不显著。
记得我较早写过一个计算思维思考的六个层次,我搜索时看到一位老师说读了六遍,很是感动。其实思维就是一种发展,需要各种慢慢的滋养。
比如,发过的计算思维概念图,主要是获得一种形象的轮廓与流程;英汉对照,是看看英语怎样描述,比如一看模式识别我们就只想到人工智能,这是有局限的,其实更接近数据模型的构建,甚至数字化的采样也是,这样就会消除单纯汉语翻译时有意无意的神化计算思维。
本期,我们思考选择语句的编程思维和数学模型构建的数学思维,再体会一下“算法”与“建模(模式识别之一)”在计算思维中的不同与相同。
【关系判断方式与编程思维】
我们知道,程序设计的基本流程是由构建数学模型、设计算法、编写程序代码、调试程序等环节所构成的,这种用计算机解决问题的过程是最受肯定的基于计算思维学习方式。
学习者往往在接触编程语言之初,更侧重计算机编程语言的语法格式学习,即使因为模仿的作用设计算法,也仍然是根据程序思考过程来进行。如此,不容易体会到计算思维的特质——计算机是如何思考、解决问题的。
以分支结构程序为学习内容,采用“判断狗狗与人的相当年龄”为问题解决,我们体会计算思初步形成过程。
第一步,对事物的描述
狗狗是人类的好朋友,成为很多老年人的好伙伴。但是,面临的严重问题之一是狗狗会因为衰老、疾病等原因往往会比主人去世更早,给产生深厚感情的他们造成伤痛。为了解狗狗年龄的规律,也为疏通狗狗主人情感,拟对狗狗年龄与人类年龄进行对比,揭示其生命周期。
至此,完全是事物描述,没有明确问题解决方案。能想到与人类年龄对比,这是事物分析能力和逻辑思维的表现,并非数学思维,也非计算思维。
第二步,构造数学模型
通过网络调查研究,发现很多与狗狗年龄分析相关的方式。与人类年龄对比,又分几种情况,可构成如下分段函数。
设相当人的年龄是y,狗狗的实际年龄是x。
y=1 (x=1)
y=22 (x=2)
y=22+(x-2)*5 (x>2)
至此,构建数学模型完全是数学思维下的问题分析,与计算思维尚不搭边。但是,为计算思维的顺利产生打好了基础。这说明,数学的确是科学技术之母。
第三步,设计算法
人们对设计算法往往容易与数学模型的构建混淆。实际上,这是基于计算思维的设计过程。解决本项问题的核心是判断,所以分析程序结构是其中的关键。以下采用自然语言方式描述算法:
输入狗狗年龄
注:不考虑用变量赋值,是为了提高程序的通用性,这是明确的计算思维。
如果x小于0 进行错误提示
注:这是计算机的容错处理,属于计算思维范畴。分支算法也是。
否则,继续判断如果x=1则显示1岁;
否则,继续判断如果x=2则显示22岁;
否则,则显示22 + (x -2)*5岁。
至此,把数学思维与基于计算分支程序相结合,初步产生了解决方案,这是基于理论层次的计算思维体现。
第四步,编写程序代码
选用Python程序设计语言,按照其语法规则实现相应算法。程序代码如下:
#!/usr/bin/python
x = int(input("请输入狗狗的年龄: "))
if x <= 0:
print("你是在逗我吧!")
elif x == 1:
print("相当于 14 岁的人哦。")
elif x == 2:
print("相当于 22 岁的人哦。")
else:
print("对应人类年龄: ", y = 22+(age-2)*5)
以上程序代码,采用int()函数转化字符串为数值,采用if elif进行判断设计,这些都是遵循以上算法。
至此,在编程中的计算思维表现主要是在程序语法规范、代码实现上,体现在程序编写技能,这是实践层次的计算思维。特别是,能够设计对输入字符的数值转化、对否定情况的分支嵌套,这完全是编程能力,如果从思维角度说自然是属于计算(机)思维方式的体现。
第五步,调试程序
在以往的调试程序中,我们可能只局限于运行程序、纠正错误,这虽然是非常重要的。但是,更对学习者来说更重要是发现问题而改进程序,并非只完成基本问题就可结束。比如,我们可以思考让程序重复执行,采用循环来改进程序,也可以采用自定义函数模块来优化程序。
至此,优化程序(调试)这个进一步思考过程也是建立在计算思维的形成基础上的。
反思整体过程,我们能够更深入地体会到,计算思维在利用程序来解决问题的一般过程与方法上具有理论、实践多重表现。
【数字关系与模式识别(数学模型)】
从数学模型到算法设计、代码编程这个过程,很容易让人忽视数学思维是计算思维的基础,过于强调算法设计与代码现实。
我们可以在外一种状态去观察。
比如,随机函数是完全属于计算机科学的一种函数,它与传统的数学思维联系并不直接,采用随机数进行模拟现象无疑是属于计算思维范畴。
现代数学研究统计、正态分布等对随机的理论贡献常人不易理解,而计算机利用“有限二进制字段上的矩阵线性递归”来模拟更真实的随机数也是基于数学与计算机科学的双重力量。
我们姑且不去讨论基于计算机强大计算能力下的计算思维的特质。我们以随机数判断的一个应用实例,观察本来用计算机特点很容易用分支程序来解决的问题,结合数学思维可以让程序技术更有机巧、更高效。这种计算思维的发展其实是真正是在数学思维的促进中成长的。
以下,先来阅读基于Python程序设计语言的“石头剪刀布”游戏程序。
#!/usr/bin/env python
import random; #导入随机模块
#数列前面设计1个空,是因为不用0表示
choice=[' ','剪刀','石头','布'];
#这个数据是关键,下面解释。
result=['你赢', '你输','平','你赢','你输'];
#产生1-3随机数
nc=int(input('请你出(1.剪刀;2.石头;3.布):'))
print('你出:',choice[nc])
jc=random.randint(1,3)
#对应结果
print('计算机出:',choice[jc])
print(result[nc-jc+2])
以上程序设计难度不在于随机数的应用,而在于输赢这种随机情况的判断。完全可以用逻辑关系,以分支程序(if )去很容易地判断。但是,我们思考的是一种更具有数学思维的方式。
第一,我们首先对双方博弈情况进行全面分析:
你出 如果计算机出 对应result 推理数学算式
1剪刀 1剪刀 [2]平 1-1+2
1剪刀 2石头 [1]你输 1-2+2
1剪刀 3布 [0]你赢 1-3+2
2石头 1剪刀 [3]你赢 2-1+2
2石头 2石头 [2]平 2-2+2
2石头 3布 [1]你输 2-3+2
3布 1剪刀 [4]你输 3-1+2
3布 2石头[3]你赢 3-2+2
3布 3布 [2]平 3-3+2
第二,输赢判断本来是一种逻辑关系,根据以上分析转化成基于列表的对应关系如下:
[0] [1] [2] [3] [4]
你赢 你输 平 你赢 你输
并由推理获得数学公式:nc-jc+2。
第三,基于列表对应关系形成列表,并推导出根据列表判断结果如下:
result[nc-jc+2]
至此,我们体会到基于计算机编程语言的数据结构是计算思维的一种重要表现形式之一。通过数学推理、数学计算等数学思维来架构更科学、高效的数学结构,会促成更深刻的计算思维形成,这样的思维是更具有生命力的。
总之,无论在是程序设计过程中观察计算思维的形成,还是从问题解决中采用数据结构让数学思维去促进计算思维的成长,这都是面向问题解决的计算思维学习设计的良好发展方向。否则,如果只是认为用程序实现算法,就会形成计算思维,这样的“编码代工“式技术作业流水线缺乏数学思维,是对计算思维非常浅显的认识。