APP下载

从解决数学问题出发认识计算思维

2023-01-30郑兴航江苏省锡山高级中学

中国信息技术教育 2023年2期
关键词:田字格语句公式

郑兴航 江苏省锡山高级中学

我国大学计算机专业许多在起始阶段都归在数学系,后来才逐渐分离独立,这种现象说明计算机学科的诞生和数学学科有着千丝万缕的联系。计算思维概念脱胎于计算机专业,而数学思维概念的提出则源于数学。笔者发现,从对数学问题解决过程入手,师生比较容易辨清与把握计算思维实质。

笔者所在学校信息技术课程“数据与计算”模块主要采用项目方式组织学生进行学习。第一阶段以使用海伦公式求三角形面积作为样例贯穿教学始终,随着预设条件不断增加,顺序、分支、循环、面向过程与面向对象编程等知识应用被渐进嵌入到项目中。第二阶段为基本算法进阶,力图通过不同问题的解决,帮助学生了解穷举、回溯和二分等算法的基本思想。

学生以Python语言为背景,首先学习赋值、输出语句的书写格式,了解语句含义。为帮助学生掌握顺序结构编程的方法,教师布置了一道思维上没有难度的基础训练题,要求学生在三条边的长度分别为5、6、7的条件下,用海伦公式编程求出三角形面积,并输出结果,海伦公式由教师预先给出。为渗透模块调用方法,本次编程需要在程序第一行,用import语句导入math模块,以便在程序中顺利使用sqrt函数。按照教师课前设想,学生编写的代码应与图1所示的程序类似。

图1

刚刚学习编程,语句格式写错是学生常犯的错误。但在帮助学生调试程序的过程中,教师发现,一个班级经常有5到6位同学编写的程序就像图2所示的程序一样,单条语句并没有错误,但语句放置的顺序不对,而且错误雷同。课后与其他信息技术教师交流,他们反映其他班级也有类似现象。教师当时只是将这种现象简单归结为学生编程习惯还没有养成。半年后在与数学老师的一次交流中,笔者突然认识到这种现象的出现并不偶然,这不仅仅是学生对赋值语句没有理解,而是与学生经过多年的数学课程学习,已经养成的数学思维习惯有关。数学关注前后逻辑关系,强调由因到果,但在表达某个结论时,其涉及的约束条件经常是放在后面做补充说明,对顺序并不像程序设计要求那么严苛。

图2

通过上述发生的教学事件,笔者认为可以通过列举一些数学问题,让学生体悟数学思维与计算思维在问题解决中发挥的不同作用来认识它们之间的区别与联系,从而加深学生对计算思维抽象与自动化本质的理解。

●通过解题步骤对应转换感受数学思维与计算思维之间存在的差异

为帮助学生纠正前文提及的程序编写错误,在后来的教学中教师有意识地对原来的教学设计进行了修改。增加教学环节,安排学生先在纸张上写出数学解题的一般步骤,然后再启发学生思考,这些解题步骤要转换成计算机可以接受的程序,需要对数学的解题步骤做哪些变通与调整,即引导学生将思维方式从数学推理模式对应迁移到应用计算模式,同时画出流程图。在比较中理解程序设计中的p=(a+b+c)/2语句的本质是指挥计算机从内存调用已经准备好的变量a、b、c的值,在运算器中按照一定规则进行计算,再把结果存储到变量p所表示的内存中,与数学中所指的p=(a+b+c)/2有本质不同。为此,在执行p=(a+b+c)/2语句之前,需要先在内存中开辟三个空间,分别命名为a、b、c,并用a=5,b=6,c=7三条赋值语句在这三个空间中存入具体数值。a、b、c、p代表的四个物理空间有了具体数值之后,才能应用海伦公式计算三角形面积s。

能够运用顺序结构描述问题解决的一般步骤,并且认识到用计算机处理问题一般要经历数据准备、数据计算、输出结果三个阶段,标示计算思维初步形成。

●问题解决不同阶段,数学思维与计算思维互相支持,各自发挥独特作用

组合数学是学生高中阶段数学学科中需要学习的一个重要模块。为得到组合数计算公式,数学教师授课一般会经过下述步骤:

(1)引导学生通过若干案例分析,认识加法与乘法原理;

(2)作为乘法原理的具体应用,得到排列计算公式A(m,n)=m*(m-1)*......*(m-n+1);

(3)在排列中去除有序性,顺理成章得到组合数计算公式C(m,n)=m*(m-1)*......*(m-n+1)/n!=m!/(n!*(m-n)!)(公式一);

(4)根据集合的一一对应关系得到公式C(m,n)=C(m,m-n),再根据某一元素取与不取,根据元素分类原则,分类统计得到公式C(m,n)=C(m-1,n-1)+C(m-1,n)(公式二)。

教学过程中辅之若干具体应用,数学学科学习主体任务即算完成。在整个学习过程中,学生分类思考、分步计算、对应变换等数学思维得到了训练与培养。

相同问题迁移到信息技术课堂,还要求学生对具体数值求出具体结果。学生需要接着思考用什么算法、程序如何编写,才能将组合数结果计算出来。不同于数学中的“数”,计算机程序涉及的“数”是有具体数据范围的,数据规模或计算结果较大有可能造成数据溢出。公式一计算直接用Python实现,整数较大时会自动转换为浮点数,会影响精度,需设计算法避免这种情况发生,如用高精度。用计算机解决问题不仅要考虑结果的正确性,在现实环境下,某些场景对计算速度和所占的空间大小要求严苛,为计算组合数,Python提供了多种计算方法,如递归、动态规划等,递归实现会出现重复计算,而动规需要开设更多空间。两种算法实现的具体程序如下页图3、图4所示。

图3

图4

在组合数计算的这个例子中,数学思维体现在梳理问题内在逻辑联系、找出规律、列出公式。计算思维不仅关注数量关系,还关注初始数据的范围、中间数据的存储,及思考由此带来的不同空间与时间复杂度等,以及用不同算法把结果算出来的效率和效益。

●数学思维品质提升改变计算思维方式

信息学奥林匹克竞赛的许多试题创意都是来源于日常生活,但欲求出最终结果,无论是数学模型建立,还是在空间与时间受到限制的条件下编程实现都不是一件容易的事情,需要较强的抽象思维能力及其他高阶思维深度参与。例如,受广场舞和走步锻炼身体刷微信步数启发,全国信息学奥林匹克联赛就出过一道求“微信步数”试题,对原题改编,将多维降为二维,题目大意是:

地面上有一个n行、m列的田字格,喜欢走步刷微信的朋友小C准备在这个田字格上按照一定规则走步锻炼身体,具体规则由k个按顺序排列的二维数组(c1,d1)、(c2,d2)、(c3,d3)、……(ck,dk)构成,其中ci=x或y,x表示要求小C沿着横向走,y表示沿着纵向走;di=1或者-1,表示向前或向后走一步。小C每天只选一个交叉点开始按规则走步,并不断重复这个规则,直到他走出了场地范围才结束一天的走步计划(走完第k步后,若小C还在场地内,他将重复规则继续走下去,当然也有可能永远结束不了)。小C每天走步所选的交叉点互不相同,很显然完成全部计划小C需要n*m天。问完成全部走步任务,小C总共走了多少步?如果完不成任务则输出-1。

非常有意思,为锻炼思维,从纯数学角度看,这道试题可以成为小学生的分类思维题,将情境分成两类:一类是可以结束的游戏,一类是无法结束的游戏。对于可以结束的类型,只要分点计算和统计,一定会得到明确结果;对于无法结束的游戏,引导学生找出内在约束条件,即k步走步规则,分纵横向,前进与后退的步数总和均为零,而且在田字格中至少存在一点,从这一点出发,一轮走步结束后,小C仍然回到了原点。问题还可以再进一步延伸讨论,一轮走步走不出边界的本质,是从这一点出发,左右、上下移动产生的位移的最大值都超越不了边界。用计算机实现,即是对走步规则,先分横向与纵向,再分左右与上下,顺序统计求最大位移。

如果思考这道问题的对象是中学生,可引导学生换一个角度思考,在游戏结果不会出现-1的前提下,让学生从单点求解、求和入手转换为统一整体考虑,想象有n*m个人在田字格中按照规则同时走步,统计每一步走步人数,很显然第一步走步人数为n*m,随着规则的继续,不断有人走出边界,人数持续减少。规则相同,用计算机实现,就是循环,直到所有人走出田字格,游戏结束。

思维品质再一次提升到竞赛层次,寻找n*m个人走出田字格的内在规律。

模拟第一轮走步,分纵横向研究每一步产生的影响,发现纵横向之间相互独立。对横向一行中的n个点,按照规则走到第i步时,向左侧移动积累的最大位移为li(负整数,即到第i步,每行有|li|个人已从左侧走出了田字格),向右侧移动积累的最大位移为ri(正整数,即到第i步,每行有ri个人已从右侧走出了田字格),一行剩下的n-ri+li个人下一步对走步贡献就是n-ri+li;同理,对纵向一列的m个点,设到i步时,向下方移动积累的最大位移为di(负整数,即到第i步,每列有|di|个人已从下方走出了田字格),向上方移动积累的最大位移为ui(正整数,即到第i步,每列有ui个人已从上方走出了田字格),一列剩下的m-ui+di个人下一步对走步的贡献就是m-ui+di。因此,走下一步时,田字格中剩下的总人数为(n-ri+li)*(n-ui+di),也是下一步对走步结果的的贡献,i=0,1,2…k-1(i表示初始状态或上一轮的集结状态)统计求和,即得到第一轮所走的总步数。

第一轮走完,横向整体产生的移动距离用a表示,剩余人数为x=n-rk+lk;纵向整体产生的移动用b表示,剩余人数为y=muk+dk。进一步研究发现,从第二轮开始,下面每一轮横向走出田字格的人数均为|a|,纵向走出田字格的人数均为|b|。从第二轮开始,前i步横向走出田字格的总人数用xi表示,纵向用yi表示。容易得到循环轮数为T=min(int(x/|a|),int(y/|b|)),用数学公式表达,第二轮开始所走的主要步数为:

x,a,y,b,xi(i=0,…,k-1),yi(i=0,…,k-1)的值,在编程计算时可先行预处理得到。归纳出一般的计算公式,数学思维的深度参与,使得这道题目的运算规模从(n*m)2降到min(n,m)*k,从科学计算角度看,这是质的跃升。

本题程序实现所占篇幅较长,有兴趣的读者可以登录网站(https://www.luogu.com.cn/)查看。

●借助计算思维设计方案,解决数学疑难问题

在数学领域,有很多问题到目前还没有确定的研究结果,用不完全归纳法去验证是常用的探索研究方法,但当数据规模较大时,人工计算将是一件不可能完成的任务,如哥德巴赫猜想、旅行商问题等。哥德巴赫猜想任一大于2的偶数都可写成两个质数之和,从数学角度思考,不完全归纳验证很简单,将给定的偶数a分解为两个质数b,c之和,所有情况一一列举出来,如果有一种分解得到的b,c均是质数,说明猜想对于具体的偶数是正确的。

随着需验证数据规模的增大,用手工方法去计算,计算量越来越大,转用计算机工具解决就变得相对简单。计算机运算速度快,善于处理规律性问题,在计算机可以处理的数据范围内,首先把所有质数预处理出来,存储在特定空间中,并用循环对每一偶数穷举所有分解并验证,微秒时间内可得到结果。不过用计算机解析出所有质数有多种算法,如试除法、埃氏筛、线性筛等,选择不同算法对存储空间和运算速度会有不同影响。同一问题用不同算法分析解决是培养学生计算思维的有效途径(如图5、图6)。

图5

图6

通过对不同类型数学问题的讨论,笔者发现,数学思维与计算思维之间既相互区别又紧密联系。数学思维重在从现象背后找出一般规律,并力争将结论用公式形式化表达出来。计算思维强调前期数据准备,中间数据计算与存储,后期数据输出;针对具体数值,形式化表达的数学结论,在不同的计算思维方式指导下可以产生不同的计算实现方法。数学思维与计算思维在问题解决的不同阶段可以各自发挥不同的作用;数学思维下思考难以完成的任务可以借助计算思维探索解决之道;数学思维品质的提升,对问题内在规律的发现,可以同步提升计算思维品质。

猜你喜欢

田字格语句公式
“田字格”器材的制作和运用
组合数与组合数公式
排列数与排列数公式
等差数列前2n-1及2n项和公式与应用
重点:语句衔接
例说:二倍角公式的巧用
住在“田”间(二)
合理使用田字格在低年级写字教学中实践探究
我喜欢
作文语句实录