计算机程序设计艺术范文

时间:2023-11-06 17:24:12

导语:如何才能写好一篇计算机程序设计艺术,这就需要搜集整理更多的资料和文献,欢迎阅读由公务员之家整理的十篇范文,供你借鉴。

计算机程序设计艺术

篇1

关键词:MATLAB;遗传算法;概率积分法;预计参数

中图分类号:TD327文献标志码:A

概率积分法是我国矿山开采沉陷预计的主要方法,提高概率积分法预计精度的关键在于减少模型误差和参数误差,模型误差主要来自于该方法的基本假设,往往难以改进,此时致力于减小参数误差意义更为明显[1]。目前求取概率积分法地表移动预计参数常采用传统的优化算法,如线性最小二乘法等,但此类算法对参数初值要求较高,而且容易出现局部极小值等问题,从而使拟合的参数失去准确性。

遗传算法(Genetic Algorithm,简称GA)是一种宏观意义下的仿生算法,它模仿的机制是一切生命与智能的产生与进化过程。它通过模拟达尔文“优胜劣汰、适者生存”的原理鼓励产生好的结构,通过模仿孟德尔遗传变异理论在迭代过程中保持已有的结构,同时寻找更好的结构[2]。与传统的优化算法相比,遗传算法适用于高度非线性的不连续多峰函数的优化,可以有效的避免出现局部极小值, 而且遗传算法对初值参数的依赖性不高,在所设定的参数范围内通过人工进化的方式获得最优解,因而具有较强的可操作性和简便性。

由于GA在大量问题求解过程中独特的优点和广泛的应用,许多基于MATLAB的遗传算法工具箱相继出现,其中出现较早、影响较大、较为完备者当属英国设菲尔德(Sheffield)大学推出的遗传算法工具箱[3]。本文便是基于此遗传算法工具箱,在MATLAB平台上设计了根据工作面任意监测点观测数据求取基于概率积分法的地表移动预计参数程序。

1概率积分法预计公式

由于X轴正方向逆时针旋转到斜向观测线的角度为44°,所以预计的斜向曲线在三维图形中显示,并通过MATLAB函数view调整视角,使拟合曲线所在的平面正对观察者,便于观察。从图3可知,曲线的拟合效果良好,预计曲线和实测值基本吻合。

遗传算法预计的走向观测线下沉值和水平移动值的中误差分别为28.15 mm和15.03 mm,它们分别占最大值的1.2%和1.7%,预计的斜向观测线下沉值和水平移动值的中误差分别为42.30 mm和33.56 mm,它们分别占最大值的1.8%和3.4%。文献[5]13-16中预计的走向观测线下沉值和水平移动值中误差分别占最大值的1.3%和4.4%,预计的斜向观测线下沉值和水平移动值中误差分别占最大值的2.1%和6.0%。通过与文献[5]13-16中采用的线性最小二乘法求参的精度比较,可知遗传算法是一种适应能力更强且求参精度更高的方法。

4结论

1) 遗传算法对参数的初值要求不高,只需在运算之前为地表移动预计参数设置合理的范围,然后通过人工进化地方式从此范围内获得最优解即可。

2) 遗传算法是一种高效的全局寻优算法,不像传统的线性最小二乘法那样易出现局部极小值,在求取预计参数的过程中能够避免出现病态问题。

3) 地表观测站实测数据往往会受到测量误差、粗差、检测点缺失等各种不利因素的影响,从而增加求取概率积分法预计参数的难度,而遗传算法具有较强的抗干扰能力,可以很好地拟合出地表移动预计参数。

参考文献:

[1]查剑锋,冯文凯,朱晓峻. 基于遗传算法的概率积分法预计参数反演[J]. 采矿与安全工程学报,2011,28(4):655-658.

[2]周明,孙树栋. 遗传算法原理与应用[M]. 北京:国防工业出版社,2002:8-150.

[3]雷英杰. MATLAB遗传算法工具箱及应用[M]. 西安:西安科技大学出版社,2005:62-94.

篇2

关键词:C++;辩证法;认识论;案例教学

程序设计贯穿于计算机专业教学的全程,是培养学生计算机能力的出发点和落脚点。对于计算机专业的学生来讲,不掌握程序设计,就不能算真正地学习了计算机。C++语言是应用最为广泛的程序设计语言之一,它功能强大,使用灵活,是大学计算机专业程序设计类课程的首选语言。但是C++语言过于灵活,被公认为是最难学的程序设计语言,尤其是指针、对象等概念的引入更进一步增加了C++语言教和学的难度。

作为认识世界和改造世界的有力工具,辩证法和认识论已用来阐释计算机科学和技术领域的某些问题[1-3],并用来指导计算机专业的课程教学[4-5]。本文将辩证法和认识论用于C++程序设计教学,对教学内容进行整合,阐述C++自身存在的辩证规律;同时,按照认知规律和实践第一的观点,提出一种新的案例教学模式。通过以上教学方法,力图解决C++教与学中存在的难题,从而达到良好的教学效果。

1辩证法指导下的教学内容设计

1.1课程的知识点及其关系

本门课程的知识点及相互间关系如图1所示。数据类型中的简单类型包括整型、实型、字符型、布尔型和枚举型等,复合类型包括数组、向量、字符串和文件等。流程控制由顺序、选择和循环三种结构完成。

数据类型和流程控制的集成形成函数,函数进一步发展形成对象,封装性、继承性和多态性是面向对象程序设计的三要素。模板编程和异常处理可以保证程序的重用性和健壮性。在求解复杂问题时,需要对程序结构进行组织,如采用多文件编程等;如果同一问题的求解有多种算法,则需进行性能测试,选择运行效率最高的算法。

图1C++语言的知识结构

1.2内容整合

C++语言与C语言、数据结构等课程紧密相关。合理安排每门课程的内容,科学地处理好三者的关系对课程教学具有重要意义。

1.2.1C语言与C++语言内容的整合

在传统的教学方法中,通常是先进行C语言教学,然后再进行C++语言教学,造成了部分教学内容的重复。因为C语言是C++语言的一个子集,因此完全可以直接进行C++语言教学,将其分为C++(上)和C++(下),C++(上)侧重于基础语法和结构化程序设计;C++(下)侧重于面向对象程序设计和简单算法。整合前后的效果如表1所示,整合后的效果明显好于整合前,体现了整体大于部分之和的系统论思想。

1.2.2与数据结构课程的衔接

C++程序设计与数据结构一脉相承,C++程序设计是数据结构教学的基础,数据结构可以促进C++程序设计水平的提高,将二者资源进行整合与共享对两门课程建设均有好处。为了使二者更好的衔接,在C++程序设计语言中主要介绍简单的排序和查找算法及线性链表的基本操作。

1.2.3教材的选择

基于前述的知识点及整合后的教学内容。我们选用了清华大学出版社出版的三本书作为教材和参考书。第一本是钱能编写的《C++程序设计教程(第二版)》(以下简称“钱版”),该书重于编程技能的培养,讲解纯粹的C++语言;第二本是谭浩强编写的《C++程序设计》(以下简称“谭版”),该书讲解细致,在讲解C++语言的同时也讲解了C语言的内容,适合初学者;第三本是郑莉编写的《C++语言程序设计(第三版)》(以下简称“郑版”),该书引入案例教学,知识讲解逐层深入,思路清晰。此外,郑版以国家精品课为支撑,配套资源丰富。

在具体教学中,我们以钱版作为教材,同时汲取谭版和郑版的部分内容,并融入我们的经验,形成具有自身特色的内容组织与安排。整本教材分为两个学期讲授:上学期讲授第一部分“基础编程”和第二部分“过程化编程”,下学期讲授第三部分“面向对象编程”和第四部分“高级编程”。

1.3C++语言自身存在的辩证规律

1.3.1变量的时空性

变量是程序设计语言中最重要的元素之一。而生存期与作用域是变量的两个重要属性,体现了变量的时空性,如图2所示。

图2变量的时空模型

下面是一个C++程序,记为代码段1,对该程序进行分析,可得图3所示的时空模型。

//代码段1

#include

using namespace std;

void test();

int n=2;//n是全局变量

int main( ){

int a=4,b=-6;//a,b是局部变量

test();

test();

}

void test( ){

static int c=1;//c是静态局部变量

int d=3;

c=c+5;d=d+7;//c,d是局部变量

n=n+9;

}

图3代码段1中变量的时空表示

1.3.2循环的递进性

循环是C++程序设计的一个难点,循环的初始条件、终止条件和步长是理解循环的三个关键因素。循环的执行具有递进性,按图4的标识有助于学生理解循环的运行过程。

图4循环的递进模型

例如,求1至100的和,有如下代码,记为代码段2。

//代码段2

sum=0;

for(i=1;i

sum=sum+i;

其循环过程如图5所示。

图5代码段2的循环递进模型

1.3.3函数的控制性

函数是程序的基本要素。函数由输入、输出及函数体组成。输入相当于原材料,函数体相当于一个加工厂(控制体),输出相当于最终产品,如图6所示。

图6函数的控制模型

例如,已知圆的半径r,设计一个函数求圆的面积与周长,有如下代码,记为代码段3。

//代码段3

Void circle(double r, double& Area, double &Circ )

{

Area=pi*r*r;

Circ=2*pi*r;

}

代码段3所对应的函数模型如图7所示。

图7代码段3中的函数模型

1.3.4类的封装性

在结构化程序设计中,一个问题是由多个函数相互协作完成的,程序=数据结构+算法。在面向对象程序设计中,一个问题是由多个对象相互协作解决的,程序=对象1+…+对象n。协作的主要方式是继承与组合。

封装性是类的基本特征,一个对象是由属性和行为组成的。一个对象就是一个黑箱。

例如,用类描述一个在光滑平面上运动的物体,其属性包括:初速度v0和加速度a,其行为包括:求某一时刻t的速度velocity和距离Distance。有如下代码,记为代码段4。

//代码段4

class move{

private://定义属性为私有

double v0,a;

public://定义行为为公开

double move(v01,a1)//构造函数

{v0=v01;a=a1;}

double Velocity(double t)//求t时刻速度

{ returnv0+a*t; }

double Distance(double t)//求t时刻距离

{ returnv0*t+0.5*a*t*t; }

}

该类可表示为一个黑箱,v0和a被封装在黑箱内,外界不可访问;Velocity(t)和Ditance(t)是对外接口,提供给外界调用,如图8所示。

图8move类的封装性

2认识论指导下的教学方法设计

认识论认为理论来源于实践,并可用于指导实践;从实践到理论,再从理论到实践,这是一个否定之否定的过程,每进行一次实践,认识就会前进一步;理性认识来源于感性认识,实践是检验真理的唯一标准。

基于以上思想,我们在教学中坚持实践第一的观点,以“问题导向,兴趣驱动,项目贯穿”为基本原则,在例题和习题的选取、案例教学、实践教学等方面提出了自己的方法。

2.1例题和习题的选取

例题和习题主要有以下四个来源。

1) 经典趣题。

如鸡兔同笼、百钱百鸡、猴子吃桃、约瑟夫问题,等等[6]。

2) 物理学方面的工程问题。

C++程序设计课程在大学一年级上、下学期开设,同期已开设大学物理课程。把物理学里面的相关工程问题引入教学符合实际,能够调动学生学习的积极性。

3)ACM程序设计大赛中的题目[7]。

将ACM引入教学有两个目的:一是通过趣味性和实用性较强的ACM题目训练学生的程序设计技巧,激发学生的成就感;二是帮助学生熟悉ACM大赛,并吸引部分学生投入到ACM竞赛中,形成一个良好的学习氛围,达到以赛代练、在赛中学的目的。

4) 教师在教学实践和科研实践中的项目。

学生成绩管理是教学实践的例子,精准施肥决策是科研实践的例子。在实际教学中,我们正是利用这两个例子进行案例教学。

2.2一种新的案例教学模式

我们发现,在教学过程中直接向学生进行理论知识的灌输,学生往往不知道学这些东西有何用,而且纯粹的理论教学也易使学生产生枯燥情绪,教学效果并不好。因此我们在教学中实施了一种以问题为导向的案例驱动教学方法。

具体来说,在每门课程讲述之前首先由教师设计并实现一个案例,并将案例演示给学生,告诉学生为了完成这个案例必须要学习哪些知识。在具体的教学中,教师将理论讲授融入于案例中,引导学生一步一步完成这个案例。通过这种方式,学生首先就有了一个目标,对所学的理论知识既看得见又摸得着,每前进一步,学生也会有一种成就感。为此,我们设计了两个案例――源于教学实践的学生成绩管理和源于科研实践精准施肥信息管理。

2.2.1学生成绩管理

学生在大学学习过程中最关心的就是自己各门课程的学习成绩。因此以学生成绩管理作为案例进行讲解,学生容易接受,易于引起学习兴趣。对学生成绩的管理主要包括计算总分和平均分、按姓名查找分数、对成绩按高低进行排序、对各分数段进行统计分析等。

2.2.2作物精准施肥管理

一个地块由DGPS划分成为了若干个40m×40m的网格(图9)。每个网格都具有不同的土壤养分(主要是氮磷钾),从而应该具有不同的施肥量。

图9划分网格后的地块

要求根据不同网格的养分含量计算每个网格的施肥量,施肥量的计算方法主要包括养分平衡法和养分丰缺指标法。

1) 养分平衡法。

养分平衡法的公式如下:

F=(Y×C-S)/(N×E)

式中F是施肥量(kg/hm2);Y是目标产量(kg/ hm2);C是单位产量的养分吸收量(kg);S是土壤供应养分量(kg/ hm2);N是所施肥料中的养分含量(%);E是肥料当季利用率(%) 。其中,S=土壤养分测定值×土壤有效养分换算系数。

养分平衡法适合于讲解顺序结构和简单数据类型等知识点。

2) 品种喜肥特性。

对某作物品种按喜肥特性分为高、中、低三个等级,每一级别对应一个施肥量。一种喜肥特性法的例子如表2所示。品种喜肥特性法适合于讲解选择结构。

3) 肥料效应函数法。

肥料效应函数法反映的是产量与施肥量之间的关系。一种常见的关系见以下表达式:

式中, 为产量, 为施肥量。为了求得最大产量施肥量,需要采用求极值和求导的方法。

肥料效应函数法适合于讲解循环结构。

2.2.3案例和相关知识点的对应

上述两个案例贯穿于整个教学过程,每个案例有若干子问题组成,每个子问题对应一个知识点。其对应关系如表3所示。

3.3实践教学

我们将C++程序设计的实践教学分为课堂实验和课程设计两个阶段。

课堂试验侧重语法,兼顾算法,分为验证性试验和设计性试验。验证性试验主要是对教师在课堂上讲的程序进行验证,注重于知识点的理解,题目来源于是学生成绩管理案例。设计性试验主要是学生自己编

写程序实现问题的求解,注重于知识点的运用,题目来源于作物精准施肥案例。

课程设计侧重算法,兼顾语法,主要任务是综合运用已掌握的语法和算法完成一个较实用的软件系统。为了激发学生的学习兴趣和发挥学生的创造性,部分课程设计题目由学生根据自己的生活实践选取。

3教学内容的课堂展现

3.1多媒体演示、板书和现场编程的统一

传统的板书式教学效率较低,不够直观,不够形象。因此现在普遍倡导多媒体教学,多媒体教学确实克服了板书式教学的缺点,但是也带了一些问题。比如,讲授速度加快,内容增多,学生接受起来有一些困难;老师和学生可能都过分关注多媒体课件,缺少了相互的理解和沟通。另外,教师受制于多媒体课件限定的形式和内容,很难进行临场发挥。在教学过程中经常会碰到一些无法预料到的情况,比如针对某个学生理解不清的环节,就需要老师在黑板上进行讲解。因此,多媒体教学并不能完全取代传统的板书式教学方式,二者必须紧密结合。

具体说来,指针与链表、函数调用及参数传递、算法对应的流程图等宜采用多媒体教学;而对于相关知识点的临时扩展和学生的随机提问宜采用板书教学。多媒体和板书相结合,既能利用多媒体教学的生动性和形象性,又能利用板书教学的灵活性和扩展性。

另外,C++程序设计教学的特殊性在于它的实践性,学生的程序设计能力是否提高是衡量教学好坏的唯一标准。为此,在集成开发环境下现场讲解代码是提高教学效果的一个重要手段。我们在教学中采用现场编程的方式向学生讲解相关知识。代码讲解有两种方式:一种是“先编后调”,即教师在课前编写好代码,然后在课堂上调试讲解;另一种是“即编即调”,即教师在课堂上现场编写现场调试。我们采用“即编即调”的方式,这有助于学生理解和掌握程序的编写过程,有助于训练学生的编程思维。

3.2从问题分析到程序设计

对于一个语法结构的引出,我们采用从具体到抽象再到具体的方法。即先从一个简单的例子抽象出语法规则,然后再使用一个稍复杂的例子加深对有语法规则的理解。

讲解一个具体的应用例子时,采用三阶段法:第一阶段为问题分析,采用流程图描述;第二阶段为算法设计,采用伪代码描述;第三阶段为编程实现,采用C++代码描述。

下面以“判断某个整数n是否是素数?”这一问题进行说明。

1) 问题分析。

本部分采用问题分析图(Program Analysis Diagram),也称为PAD流程图[8],对问题进行分析。PAD图用二维的树形结构描述程序的逻辑,使用了结构化的记号系统,具有开放性。用PAD图表示算法更直观,易于理解。素数问题的PAD图如图10所示。

图10素数问题的PAD图描述

2) 算法设计。

为了使算法的书写符合规范,主要采用Donald E.Knuth的算法书写方式[9]。在该种方法中,每个步骤都以一个标号进行标识,符号用来表示赋值,符号■作为算法结束的标记。

输入:n//n为输入的某个整数

输出:flag//flag为布尔变量,表示是否为素数

算法:Prime

P1[初始化] i2,flagtrue

P2[判断是否能被2至n之间的数整除]

For i=2 To n DO

IF n%i=0 THEN DO (flagfalse;break;)

P3[返回n是否为素数]

RETURN flag■

3) 编程实现

为了保证程序的清晰性和易读性,程序书写采用层次递进方式,如代码段5所示。

//代码段5

bool prime(int n)

{

int i;

bool flag=true;

for(i=2;i

if(n%i==0)

{flag=false;break;}

return flag;

}

4结语

本文以辩证法和认识论指导C++程序设计教学,整合了相关教学内容,提出了新的教学方法。在教学内容方面,将C和C++作为整体进行教学,撇弃了重复内容,精简了学时;新方法便于学生在本质上理解C++语言中变量、循环、函数和对象的基本特征和规律。突出实践教学,提出课堂实验、课程设计和毕业实习相结合的实验教学体系;将科研项目、经典案例和大赛题目引入程序设计教学,激发了学生的学习兴趣和实践动手能力。

辩证法和认识论的内容非常丰富,相关规律仍需通过教学实践进一步总结。同时,本文提出的教学方法对其他课程的教学也具有一定的借鉴意义。

参考文献:

[1] 陈次白,丁晟春. 浅谈计算机科学技术应用中的辩证思维[J]. 南京理工大学学报:社会科学版,2000,13(2):20-23.

[2] 赵致琢. 关于计算机科学与技术认知问题的研究简报(I,II)[J]. 计算机研究与发展,2001,38(1):1-15.

[3] 于合龙,赵玉鑫. 计算机科学与技术中的系统论与辩证法[J]. 计算机教育,2010(4):76-79.

[4] 刘志芳. 哲学思想在计算机组成原理教学中的体现与作用[J]. 电脑知识与技术:学术交流,2007(12):1765-1766.

[5] 王立柱. C++学习中的一个整体性问题[J]. 计算机教育,2007(20):74-76.

[6] 戴艳. 零基础学算法[M]. 北京:机械工业出版社,2010:316-398.

[7] 李文新,郭炜,余华山. 程序设计导引及在线实践[M]. 北京:清华大学出版社,2007:83-210.

[8] 张长海,陈娟. 以“PAD”为工具讲授“程序设计”[J]. 吉林大学学报:信息科学版,2005,23(增刊1):44-48.

[9] DONALD E. Kunth. 计算机程序设计艺术[M]. 3rd ed. 苏运霖,译. 北京:国防工业出版社,2007:1-7.

C++ Language Teaching Method Based on Dialectics and Epistemology

YU He-long1, CAO Li-ying1, CAO Hong-bo2

(1.College of Information Technology, Jilin Agricultural University, Changchun 130118, China;

2.College of Computer , Jiangsu Teachers University of Technology, Changzhou 213001,China.)

篇3

关键词:计算机教育;数学素养;思维能力

一.前言

数学在人类文明的发展历史中发挥着重要的作用,推动了重大的科学技术进步。尤其是到了二十世纪中叶以后,数学的理论研究与实际应用之间的时间差已大大缩短。当前,随着计算机应用的普及,信息的数字化和信息通道的大规模联网,依据数学所作的创造设想已经达到可即时试验、即时实施的地步。数学技术一直是一种应用最广泛、最直接、最及时、最富创造力的实用技术。

数学为计算机的发明和发展壮大提供了坚实的理论基础。早在1936年,英国数学家图灵(Turing)发表了对计算机具有奠基意义的论文《论可计算数及其在判定问题上的应用》,里面提出了计算的图灵机模型,该模型即为现代计算机模型的原型。为纪念数学家图灵,美国计算机学会于1966年设立了计算机界最负盛名的“图灵”奖,以表彰那些对计算机事业做出重要贡献的个人。数学是所有工科的基础,其中离散数学已经成为计算机科学发展的理论基础。图灵奖的获得者中有不少是学数学或者数学家出身。1974年获奖的Donald E. Knuth 被称为现代计算机之父,之前在加州理工获得数学博士学位,著有经典著作《计算机程序设计艺术》4卷。Richard M.Karp 于1985年获奖,之前在哈佛大学获应用数学博士学位。1986获奖的Robert E.Tarjan在斯坦福大学同时获得数学和计算机的博士学位,主要研究图论、算法和数据结构。

当前计算机理论及应用的壮大和发展更是离不开近代数学的发展。将计算机与数学的发展分割开来既不合理也不现实。和所有学科一样,计算机领域也有自己的问题,比如什么是可计算的,什么是实际可计算的。这些计算模型本质上是数学的应用。离散结构上的算法研究无疑是计算机科学中的重要领域。研究算法需有扎实的数学功底,就机器学习领域的研究而言,通常要对所处理的数据建立不同的数学模型如分类模型、回归模型和排序模型。一般地,先针对这些问题建立特定的模型,然后采用有效的优化算法来求解这些模型。应用数学如矩阵论、多元统计分析和最优化理论可以为深入地研究机器学习领域提供理论基础。

在实际的工作中,会经常看到数学基础

好、具有一定数学素养的人解决问题会游刃有余且后劲足,学习新事物和新东西会比较快,会表现出一定的创造性。但是当前大学的课程安排普遍存在对学生的数学学习的掌握程度不是很重视,导致学生对数学课的态度停留在学习时仅了解,一学完就全忘,到用时就迷惑的一知半解状态。教师在教授专业课和专业基础课的过程中,没有引导学生深入地发掘理论背后的数学本质,导致学生对计算机科学理论的理解只能停留在表面,凭机械性记忆而没有彻底理解。

鉴于上述数学在计算机的发明发展和实际工作中的重要作用,因此,在计算机教育的过程中,迫切地需要培养学生的数学素养以满足现实工作和学习中解决实际问题的需要。

二、数学素养的培养

    《算法设计与分析》是计算机专业的一门重要的专业课,有利于培养学生分析问题和解决问题的能力,为学生学习后续课程打下坚实的基础。下面结合这门课程来谈谈在计算机课程中如何培养学生的数学素养。

(一)结合算法的发明史来讲解算法

深入学习计算机科学需要有良好的数学

基础,对于算法的学习更是如此。研究算法的图灵奖获得者中有很多是数学家或者学数学出身,如图论中有很多算法是以前面提到的Robert E.Tarjan的名字命名的,著名的Dijkstra最短路径算法由Edsger W.Dijkstra发明,而他2000年退休前一直是美国Taxas大学的计算机科学和数学教授。前面提到的Donald E. Knuth则是字符串匹配算法KMP算法的发明人。给学生讲解算法的发明历史一方面帮助学生了解发明算法的背景和发明过程,激发学生的创新欲望;另一方面让学生认识到数学的重要性和其在该课程所涉及的领域中发挥的重要作用。

(二)结合学生所掌握的数学知识来讲解算法

修读该门课程的对象一般为大学高年级

学生,他们之前应该修过其他的数学课程,如高等数学(数学分析)、线性代数和离散数学。通常教师在讲授该课程的过程中会认识到离散数学在其中发挥的作用,会有意识地提及离散数学的知识,但实际上学生学习的高等数学或线性代数的知识对理解该门课程也是有帮助的。下面通过一个例子来说明数学知识对理解算法正确性的重要作用。

设计完算法如何证明算法的正确性呢?对于顺序结构和选择结构比较好验证,而对于循环结构就使用循环不变量(Loop Invariant)来证明。而循环不变量的证明实际上借鉴了数学归纳法的思想:循环发生前某个循环不变量为真,循环进行的过程中保持为真,那么循环结束时,该循环不变量仍然为真。循环发生前相当于时,而循环进行的过程保持为真,相当于断言:如时为真,那么为真。因此可以断定:无论循环体循环多少次,该循环不变量总为真。

其他的例子,包括:比较算法的时间复杂度时可以引入高等数学中的无穷小量来讲解;计算时间复杂度也会涉及到利用无穷级数的估计等等。

(三)结合数学工具来可视化算法

理论的发明通常是从简单直观的例子中归纳得来的。数学工具可以帮助我们理解和

可视化算法。

   图1  时间复杂度的比较:线性、平方、指数、

       

  对数的时间复杂度函数

图1使用 Matlab工具语言直观地给出了几种常用的时间复杂度的比较,便于学生理解不同的复杂度随着问题规模增长的快慢。学生从该图中可以很容易地得出:在这几种复杂度函数中,指数复杂度随增长最快,而对数复杂度增长最慢。

(四)结合数学抽象思维来帮助学生理解算法

数学的抽象思维可以帮助学生站在更高的角度来看待问题和算法之间的联系。算法通常是针对某一类问题的,而如何对问题进行归类,如何选择合适的算法解决是值得学生去探究的问题。讲解算法时,应该帮助学生抽象出问题的本质,同时注意算法之间的联系与区别。

计算点对之间的距离是算法设计中一个

经典问题,如果源点单一,可采用Dijkstra最短路径算法,而计算图中任意点之间的最短路径,使用Floyd-Warshall最短路径算法会合适一些,但是如果图上的权重存在负 值,那就要用带松弛操作的Bellman-Ford算法求解。了解了这些知识后,学生在把问题抽象成特定的算法模型时,就可以正确地使用合适的算法了。

其他问题包括使用矩阵胚理论来证明贪心算法的正确性以及灵活应用动态规划来求解离散结构上的最优化问题等等。

三、总结

     数学在计算机的发展和应用中的重要作用表明了数学素养的培养在计算机教育中的重要性。通过算法设计与分析课程的例子,第二节给出了4种方法阐述了如何在教学中培养学生的数学素养。然而,方法的最终目标是通过数学这个工具培养学生的自学能力,如同著名的教育家陶行知指出的那样:“我以为好的先生不是教书,不是教学生,而是教学生学”。因此,通过学生的数学素养的培养能起到锻炼学生思维能力和自学能力的目的。从这个意义上讲,在计算机教育中培养数学素养具有一定的积极作用和参考价值。

[参考文献]

[1] 范辉,余雪丽,邱宜坪,李晋江,在计算机教育中必须加强现代数学教育[J],太原理工大学学报(社科版),2001(19).