文档库 最新最全的文档下载
当前位置:文档库 › 编程是一门艺术

编程是一门艺术

编程是一门艺术
编程是一门艺术

编程:是一门艺术

摘要:Knuth在他的多卷书《计算机编程艺术》中向我们展示了计算机编程的技巧和艺术性,并在其图灵奖演说中论述了计算机编程和艺术的关系。这篇文章受Knuth著作的启发,进一步阐述为什么计算机编程应该是一门艺术并通过代码展示艺术的主要表现形式。

图片来源:accidentally in code

1. 引言

"(program(computers) == *art) ? so : what"

“只有大约5%的程序员能够在编写代码时创造出艺术。其他95%一定是为了取得成功的科

学家,不是艺术家。”

谈及“艺术”,人们自然会联想到“美”、“技艺”、“灵感”等词,但很少会把它和“计算机

编程”这听起来似乎无趣的词联系在一起。而Donald Knuth,《计算机编程的艺术》多卷

书的作者,通过他的著作,成功地展现了计算机编程的艺术。随后他又在图灵奖演说[1]中

对计算机编程的艺术做了科学地论述和诠释。他不是第一个这么做的人,但无疑他是最成功

的一个。Guido van Rossum,Python的设计者,如是说:

“我同意Knuth对…艺术?一词的定义(或使用)。对于我来说,它和创造性联系十分紧密,

而这对于我的工作非常重要。如果(计算机编程)其中没有艺术,它将没有任何乐趣,而我

也不会在30年之后仍然从事它。”

编写优美的程序需要灵感和高超的技巧,就像诗人写诗,画家作画,建筑师构筑,充满

了乐趣、挑战和美。优雅的程序会像诗歌一样耐人寻味,像名画那样大开眼界,像教堂一样

堂皇华丽。所以,计算机编程也同样是一门艺术,程序员就是创造这种艺术的艺术家。

2. 编程之美

什么样的程序才是美的程序?这个问题似乎没有完整的答案。一个很酷的Demo或一

个很炫的视频游戏都能让我们赞叹不已。Doom和Half Life可以说把3D技术推向了极至,

这种程序总能给人一种视觉上的美,就像画家手中的美丽油画,只是程序员们的画布在电脑

屏幕上,画笔是键盘。Linux也是一种美,一种开放的美,从Unix那里继承来的优雅的设计,强大的可移植性,丰富的工具,这让它看起来像优秀建筑师们设计的一座富丽堂皇的教堂。这些美是显而易见的。还有一种美,隐藏在程序背后,流动于源代码之中。什么又是美的代码呢?可能它们一看上去就很美。这里有一个惊人的宏定义的C代码集合[2]:允许程序建立常量,使它们看上去像是屏幕上的图形!程序的自描述能力大大加强!

#define X )*2+1

#define _ )*2

#define s ((((((((((((((((0

static unsigned short stopwatch[] =

{

s _ _ _ _ _ X X X X X _ _ _ X X _ ,

s _ _ _ X X X X X X X X X _ X X X ,

s _ _ X X X _ _ _ _ _ X X X _ X X ,

s _ X X _ _ _ _ _ _ _ _ _ X X _ _ ,

s _ X X _ _ _ _ _ _ _ _ _ X X _ _ ,

s X X _ _ _ _ _ _ _ _ _ _ _ X X _ ,

s X X _ _ _ _ _ _ _ _ _ _ _ X X _ ,

s X X _ X X X X X _ _ _ _ _ X X _ ,

s X X _ _ _ _ _ X _ _ _ _ _ X X _ ,

s X X _ _ _ _ _ X _ _ _ _ _ X X _ ,

s _ X X _ _ _ _ X _ _ _ _ X X _ _ ,

s _ X X _ _ _ _ X _ _ _ _ X X _ _ ,

s _ _ X X X _ _ _ _ _ X X X _ _ _ ,

s _ _ _ X X X X X X X X X _ _ _ _ ,

s _ _ _ _ _ X X X X X _ _ _ _ _ _ ,

s _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

};

这种只能在Usenet或混乱C代码竞赛中才能见到的代码虽然没有多少实际用处,但它的确能让我们感受到代码——一堆有规则的符号——也能创造出视觉上的美。也可能是程序使用的技巧——算法很美,就像汉诺塔程序,快速排序程序,自然而然地使用递归让它们看起来很紧凑,易读,这当然也是一种美,是只有程序员才能体会到的美。还有一种美,深藏在代码之后,是程序的设计思想之美,一种需要领悟的美。Unix带给我们的不仅是它的强大功能,还有它那深邃的设计哲学[3]:

“小巧就是美的。”(Small is beautiful.)

“让每个程序都擅长做一件事。”(Make each program do one thing well. )

“一切都是文件。”(Everything is a file.)

“沉默是金。”(Silence is golden.)

“让操作系统内核小而轻巧。”(Make operating system kernels small and lightweight.)这些思想在Unix设计中不失为黄金法则。这种美将穿越时空,千古流传,让Unix不仅仅是一个优秀的操作系统,而成为一门计算机领域的哲学。

人们都喜欢美的东西,程序员们更是珍视美的程序,我们把那些创造美好程序的人尊称为“黑客”。Paul Graham认为黑客和画家很相似[4]:

黑客和画家的共同之处是,他们都是创造者。和作曲家,建筑师,作家一样,黑客和画家尝试去做的也是创造好的东西。他们本身并不做研究,但是如果在创造好东西的过程中发现了一些新的技术,那就更好了。

好的画家是艺术家,那么好的程序员——黑客——也是艺术家。这也就不难理解为什么很多Unix内核黑客都留着艺术家式的络腮胡了。

3. 编程之巧

灵巧的程序像含蓄的诗歌,需要仔细领悟,用心去体会,茅塞顿开后方能回味无穷。真乃“会当临绝顶,一览众山小”!同样是求pi,但是只有简单的四行C代码却能打印出pi的前800位的程序定会让我们大开眼界[5]:

int a=10000,b,c=2800,d,e,f[2801],g;

main(){

for(;b-c;)f[b++]=a/5;

for(;d=0,g=c*2;c-=14,printf("%.4d",e+d/a),e=d%a)

for(b=c;d+=f[b]*a,f[b]=d%--g,d/=g--,--b;d*=b);

}

黑客们不会墨守陈规,他们不断地创新,寻找更巧的方法来解决同样的问题。曾经流行编写这样一种程序,它能够打印它自己的全部代码。程序员们努力寻找最短的这种程序。这虽然没多大实际用处,但是充满了挑战性,黑客们把这当作乐趣。看看下面的程序[6]是多么怪异。

char *f="char *f= %c%s%c;main(){printf(f,34,f,34,10);} %c";

main(){printf(f,34,f,34,10);}

计算机编程吸引人的很大一部分在于它需要高超的技巧,也正是这些技巧才使我们看到了美,从中得到了乐趣。而且,我发现,当限制增加时,技巧将会更高,乐趣也会随之增加。来写这样一段程序,让它在屏幕上打印1~1000之间的数字。这对于一个新手来说也是小菜一碟,一个for 循环就搞定。好,我们加一个限制,不许使用任何循环。这时你得动一

番脑筋了,不过你还是会想到用递归可以完成。不错,我们再加一个限制,也不许用递归。这可能把你难住了,你可能会认为不可能有这样的程序,那看看下面的程序吧:#include

#define A(x) x;x;x;x;x;x;x;x;x;x;

int main (void)

{

int n = 1;

A(A(A(printf ("%d ", n++))));

return0;

}

既没有用循环,也没有用递归,而是使用了宏!我们常常惊讶于世界各地著名的Warez 组织推出的64k的3D动画,那么小的程序,往往有难以想象的效果。它们把64k的限制和汇编的威力运用到了极限,这种技术让人叹为观止。64k似乎并没有限制住其艺术性,反而起了促进作用。并且,当你对系统有足够的了解时,乐趣将会更多。因为你可以使用技巧和系统开玩笑了,欺骗它,作弄它,甚至攻击它。看下面的程序:

void main() {

int x;

x = 0;

x = 1;

printf("%dn",x);

}

想一想,如何才能让程序跳过“x=1;”这一句而在屏幕上打印0?如果你对系统堆栈了解的话,你可能会给出类似下面的程序[7]:

void function(int a, int b, int c) {

char buffer1[5];

char buffer2[10];

int *ret;

ret = buffer1 + 12;

(*ret) += 8;

}

void main() {

int x;

x = 0;

function(1,2,3);

x = 1;

printf("%dn",x);

}

它利用了调用函数时堆栈的变化,改变函数的返回地址,跳过了“x=1;”这一句而直接执行下面的printf!它成功的欺骗了系统!如果把返回地址改成你预先放置的一段代码的首地址,那么你将会劫持系统,让它运行你的那段代码。如果那段代码足够巧,你将能获得系统的完全控制权!这也是缓冲区溢出的基本原理。我想,这种技巧将会让你兴奋不已,丝毫不亚于陶醉在自己诗里的诗人。我们已经看到:巧妙产生美,并与之形成艺术的雏形。

4. 编程之乐

计算机给人的乐趣在于,如果你有什么好的想法,你可以马上实验去得到结果。当然,你可能不会立刻得到正确答案,而必须坐下来,盯着电脑屏幕,苦思冥想求解问题的有效方法,通过不断的尝试去验证你的结果。可以通过找到正确的方法,使问题突然消失,也可以换一个角度,突然灵光闪现:原来是这样!

编程是对创造力的训练,好的程序员不会循规蹈矩,不会使用平庸的方法去解决问题,而是根据自己的见解去寻找更简单的方法,因为他们能看到隐藏在问题背后的实质。然后他们会写出全新而漂亮的程序去验证他们的方法。“不过还是很难说清楚,闭门苦思冥想地要找到解决某个问题的漂亮答案,为什么竟会有如此巨大的魅力。但是,你要是曾经有过找到更好方法的经历,你就会明白,这简直是无以伦比的感觉。”[8]这种感觉能让我们快乐得像一个孩子,乐不知疲。

这种“无以伦比”的感觉,流动在程序员体内,让程序员们为之痴迷,疯狂。而痴迷的程序员从他艺术性的创造中得到了难以言传的乐趣,并让为之上瘾。Linux之父在他的传记[8]中这样谈及他所体会的编程的乐趣:

编程给人带来最初的兴奋很好解释:那就是通过编程你可以支配一台计算机,你叫计算机做什么,它就做什么,永远准确无误,而且毫无怨言。这本身就很有意思。

它比下棋之类的游戏更有乐趣得多,因为它可以由你自己来制定游戏规则。而你制定什么样的规则,也就会导出与此规则相符合的结果。

在电脑世界中,你就是创世者,你对所发生的一切拥有最终的控制。如果你功力深厚,你可以是上帝——在一个较小的层面上。

无疑,乐在其中,外行人永远体会不到,毕竟“子非鱼安知鱼之乐”。无穷无尽的乐趣让程序员们模糊地体会到了作为艺术家的快乐,并且开始享受他们的工作。

5. 结论

Rob Pike曾悲观地叹息:“那种艺术消失了。”[9]但是,我想当他看到诸如《汇编语言的艺术》和《Unix编程艺术》之类的书时,他也会高兴。这种艺术并没有消失,而且还会流传下去。我们不应该因“为艺术而艺术”而感到不好意思。正如Knuth所言[1]:

“我们已经看到,计算机编程是一门艺术,因为它把积累的知识应用于世界,因为它需要技巧和灵巧,尤其是因为它创造出了美的目标。模糊地意识到自己是一个艺术家的程序员将会享受他所做的工作,而且将会把它做得更好。”

或许,我们应该为了“艺术”的圣杯,举起我们的双刃剑打斗一番。但是,比起剑来,我更喜欢犁头,我本人。

6. 致谢

特别感谢王亚刚老师,他能不厌其烦地阅读此文并给我提出宝贵的意见,没有他的指点我不可能完成这篇论文。

参考文献

[1]DonaldE. Knuth, Programming As An Art, ACM Turing Award

lecture,1974.

[2]Peter van der Liden, Expert C Programming,Prentice Hall, 1994.

[3]Mike Gancarz, Linux and the UnixPhilosophy, Digital Press, 2003.

[4]Paul Graham, Hackersand Painters, O'Reilly, 2004.

[5]International Obfuscated CCode Contest, https://www.wendangku.net/doc/ac12372046.html,.

[6]Eric S. Raymond, JargonFile, https://www.wendangku.net/doc/ac12372046.html,/jargon/html/index.html.

[7]Aleph One,Smashing The Stack For Fun And

Profit,https://www.wendangku.net/doc/ac12372046.html,/stf/smashstack.html.

[8]Linus Torvalds andDavid Diamond, Just for fun, Harper Business, 2001.

[9]RobPike,SystemsSoftware Research Is

Irrelevant,https://www.wendangku.net/doc/ac12372046.html,/rob/utah2000.pdf, 2000.

分形与分形艺术

分形与分形艺术 我们人类生活的世界是一个极其复杂的世界,例如,喧闹的都市生活、变幻莫测的股市变化、复杂的生命现象、蜿蜒曲折的海岸线、坑坑洼洼的地面等等,都表现了客观世界特别丰富的现象。基于传统欧几里得几何学的各门自然科学总是把研究对象想象成一个个规则的形体,而我们生活的世界竟如此不规则和支离破碎,与欧几里得几何图形相比,拥有完全不同层次的复杂性。分形几何则提供了一种描述这种不规则复杂现象中的秩序和结构的新方法。 一、分形几何与分形艺术 什么是分形几何?通俗一点说就是研究无限复杂但具有一定意义下的自相似图形和结构的几何学。什么是自相似呢?例如一棵苍天大树与它自身上的树枝及树枝上的枝杈,在形状上没什么大的区别,大树与树枝这种关系在几何形状上称之为自相似关系;我们再拿来一片树叶,仔细观察一下叶脉,它们也具备这种性质;动物也不例外,一头牛身体中的一个细胞中的基因记录着这头牛的全部生长信息;还有高山的表面,您无论怎样放大其局部,它都如此粗糙不平等等。这些例子在我们的身边到处可见。分形几何揭示了世界的本质,分形几何是真正描述大自然的几何学。 “分形” 一词译于英文Fractal,系分形几何的创始人曼德尔布罗特(B.B.Mandelbrot)于1975年由拉丁语Frangere一词创造而成,词本身具有“破碎”、“不规则”等含义。Mandelbrot研究中最精彩的部分是1980年他发现的并以他的名字命名的集合,他发现整个宇宙以一种出人意料的方式构成自相似的结构(见图1)。Mandelbrot 集合图形的边界处,具有无限复杂和精细的结构。如果计算机的精度是不受限制的话,您可以无限地放大她的边界。图2、图3 就是将图1中两个矩形框区域放大后的图形。当你放大某个区域,它的结构就在变化,展现出新的结构元素。这正如前面提到的“蜿蜒曲折的一段海岸线”,无论您怎样放大它的局部,它总是曲折而不光滑,即连续不可微。微积分中抽象出来的光滑曲线在我们的生活中是不存在的。所以说,Mandelbrot集合是向传统几何学的挑战。 图 1 Mandelbrot集合

计算机程序设计艺术程序设计的艺术

计算机程序设计艺术:程序设计的艺术 疯狂代码 https://www.wendangku.net/doc/ac12372046.html,/ ?:http:/https://www.wendangku.net/doc/ac12372046.html,/SoftwareEngineering/Article35529.html 刚才来计院时候经过了艺术学院那儿好像有个人画展 我突然意识到对我这个世界上只有种艺术那就是编程艺术 人们总是认为写是件很枯燥很无聊事 即使是很多IT从业者也有这样想法 所以会觉得做员是件很苦事情 其实任何份工作这样你喜欢就不会无聊 即使像这样没有生命东西也有很多美妙东西可以说 说到语言我们很多人首先会想到就是语法 没错语法很重要但他就像ABC的于英国人最基础不过了 所以语法于艺术无关 对于设计无非以下规则:简洁易懂效率高(当然功能实现也和艺术无关) 移植性扩展性是分析员要考虑工作和我们无关 首先说是简洁易懂 为了让维护人员更好地理解我们我们要写出更规范标准代码 buf1buf2temp1temp2这样变量名只会招致别人唾骂 驼峰式和匈牙利命名法是目前比较流行命名规则 简洁就意味着goto这样语句是不可以使用了 而java里两层或两层以上语句也是能省则省 下面说就是效率了 多项式时间复杂度是解决任何问题目标 决不能为了偷工减料而采用复杂度较差算法 永远记住越来越快CPU永远只为用户服务 提到效率就得说说java了 其实我在大时候就已经开始看java方面书了 但我对java直很抵制就是他解释执行 但是凡事都有两面性java平台无关性从某种意义上意味着未来趋势

好了说了这么多该言归正传了 设计艺术应该是在完成上述所说高效率编程基础的上在加上些画龙点睛的笔 所谓画龙点睛就是些看似微不足道语句事实上却带来翻天覆地变化地方 前两天看到了个有关快速排序 就是段交换语句让我看了足足半个小时 天哪太美了 就是这个简单 3句交换语句却可以极大地提高执行效率 我粗略地估计了下对于个16个数字 不加这段和加上这段执行次数分别为15和9 效率提高了足足 3分的 太神奇了 说了这么多好像就没有对设计艺术下个定义 本来有想可是写到这儿我突然意识到我只是看到了冰山角 我根本没有资格给他下定义真害怕会贻笑大方 但不管怎样我追求艺术心永远不会停止 2009-2-12 3:47:20 疯狂代码 https://www.wendangku.net/doc/ac12372046.html,/

程序设计心得体会讲课教案

程序设计心得体会 程序设计心得体会一:程序设计心得体会 在这为期半个月的时间内,通过我们小组各成员之间的相互讨论和合作,我们完成了学生信息管理系统的程序设计,更值得高兴的是我们的程序得到了大家的喜爱,在每次的简报中都得到了较好的成绩。 虽然在上个学期中,我们已经学习了《C语言程序设计》这门课,但是我所学的知识最多也就是在做作业的时候才会用到,平时没有什么练习的机会,这次的课程设计是我第一次通过自己构思,和同学讨论并且不断查阅资料来设计一项程序。这次设计,不仅巩固了我以前所学的知识,还让我对c语言有了更深一步的了解,掌握了更多的技巧和技能。 C语言是计算机程序设计的重要理论基础,在我们以后的学习和工作中都有着十分重要的地位。要学好这种语言,仅仅学习课本上的知识是不够的,还要经常自己动手,有较强的实践能力。只有多动手,经常编写程序,才能发现我们学习上的漏洞和自己的不足,并在实践中解决这些问题,不断提高自己转化知识的能力。 在我们小组有解决不了的问题时,我们会主动查阅相关的资料,或向其他同学询问,这不仅丰富了我们的知识,还增进了我们同学之间的友谊。为了增大信息的安全性,需要用文件来存储信息,由于我们在上课时不注重对文件的运用,所以在这方面有较大的困难。我先将书本认认真真地看了一遍,又做了一下课后习题来验证和增进自己的理解,终于,经过我们的不懈努力,我们小组的程序有了突破,成功地实现了用文件来保存并查看学生的信息。 这次设计中,我的收获还有就是学会了用流程图来表达自己的想法,并根据流程图来逐步实现程序的功能。开始的时候,我画流程图很是困难,需要一个多小时才能清楚的根据自己的想法画出图来,后来画多了,就更加了解它的功能,十分得心应手,能够比较快而准确的画出来。 在这次课程设计中,我们首先对系统的整体功能进行了构思,然后用结构化分析方法进行分析,将整个系统清楚的划分为几个模块,再根据每个模块的功能编写代码。而且尽

趣味数学--分形艺术

神奇的分形艺术:无限长的曲线可能围住一块有限的面积 很多东西都是吹神了的,其中麦田圈之谜相当引人注目。上个世纪里人们时不时能听见某个农民早晨醒了到麦田地一看立马吓得屁滚尿流的故事。上面这幅图就是97年在英国Silbury山上发现的麦田圈,看上去大致上是一个雪花形状。你或许会觉得这个图形很好看。看了下面的文字后,你会发现这个图形远远不是“好看”可以概括的,它的背后还有很多东西。 在说明什么是分形艺术前,我们先按照下面的方法构造一个图形。看下图,首先画一个线段,然后把它平分成三段,去掉中间那一段并用两条等长的线段代替。这样,原来的一条线段就变成了四条小的线段。用相同的方法把每一条小的线段的中间三分之一替换为等边三角形的两边,得到了16条更小的线段。然后继续对16条线段进行相同的操作,并无限地迭代下去。下图是这个图形前五次迭代的过程,可以看到这样的分辨率下已经不能显示出第五次迭代后图形的所有细节了。

当把三条这样的曲线头尾相接组成一个封闭图形时,有趣的事情发生了。这个雪花一样的图形有着无限长的边界,但是它的总面积却是有限的。 这个神奇的雪花图形叫做Koch雪花,其中那条无限长的曲线就叫做Koch曲线。他是由瑞典数学家Helge von Koch最先提出来的。麦田圈图形显然是想描绘Koch雪花。Koch曲线于1904年提出,是最早提出的分形图形之一。下面我们来看Koch雪花的面积与周长,如下图

周长为次分叉图第4n 设图1三角形周长为31=P ,面积为4 31=A ; 第一次分叉图2;913,3411212A A A P P ??+==面积为周长为 第二次分叉图3 … 面积为 1121211)9 1(43)91(43913A A A A n n --??++??+?+=Λ ]})9 4(31)94(31)94(3131[1{221-+++++=n A Λ Λ,3,2=n 雪花曲线令惊异的性质是:无限长的曲线可能围住一块有限的面积。 ;91431223?????????????? ????+=A A A 面积为Λ ,2,1)34(11==-n P P n n ]})9 1[(4{31121A A A n n n n ---+=,周长为12 334P P ??? ??=

2014-2015-并行程序设计期末考试卷

中 国 科 学 技 术 大 学 2014-2015学年第一学期考试试卷 考试科目: 并行程序设计 得分:___ ______ 学生所在系:______ _____ 姓名:____ _ _ 学号:_ ____ ______ 一、 分析以下3个循环中存在的依赖关系;分别通过循环交换、分布 和逆转等多种方法来尝试向量化和/或并行化变换:(3×10=30分) p 的二维 拓扑结构,并且将各个行或列进程组划分为单独的子通信域。这样,root 进程可先在其行子通信域中进行广播,然后该行中的所有进程在各自的列通信子域中再广播。给出该广播方案的MPI 具体实现。(20分)

三、设有两个进程A和B,以及结构变量stu。现在,进程A将stu发 送给进程B。请用三种不同的MPI实现来完成进程A的发送操作。(3×10=30分) struct Student {int id; char name[10];double mark[3]; char pass; } stu; 四、以下是单处理器上的矩阵求逆算法: Begin for i=1 to n do (1) a[i,i]=1/a[i,i] (2)for j=1 to n do if (j≠i) then a[i,j]=a[i,j]*a[i,i] end if end for (3)for k=1 to n do for j=1 to n do if ((k≠i and j≠i)) then a[k,j]=a[k,j]-a[k,i]*a[i,j] end if end for end for (4)for k=1 to n do if (k≠i) then a[k,i]= -a[k,i]*a[i,i] end if end for end for End 矩阵求逆的过程中,依次利用主行i(i=0,1,…,n-1)对其余各行j(j≠i)作初等行变换,由于各行计算之间没有数据相关关系,因此可以对矩阵A按行划分来实现并行计算。考虑到在计算过程中处理器之间的负载均衡,对A采用行交叉划分:设处理器个数为p,矩阵A的阶数为n,??p =,对矩阵A行交叉划分后,编号为i(i=0,1,…,p-1)的处理器存有A的第i, i+p,…, i+(m-1)p n m/ 行。在计算中,依次将第0,1,…,n-1行作为主行,将其广播给所有处理器,这实际上是各处理器轮流选出主行并广播。发送主行数据的处理器利用主行对其主行之外的m-1行行向量做行变换,其余处理器则利用主行对其m行行向量做行变换。 请写出矩阵求逆算法的MPI并行实现。(20分)

MPI并行程序设计实例教程

编辑推荐 ◆书中内容侧重于以MPI库为基础开发并行应用程序,对MP规范定义的各项功能和特征在阐述其特点基础上均配以实例加以说明和印证。 ◆书中所附实例尽量采用独立的功能划分,其中的代码片段可直接用于并行应用程序开发 ◆在讲述基本原理的同时,注重对各项消息传递和管理操作的功能及局限性、适用性进行分析从而使熟读此书的读者能够编写出适合应用特点,易维护、高效率的并行程序。 ◆与本书配套的电子教案可在清华大学出版社网站下载。 本书简介 本书旨在通过示例全面介绍MP1并行程序开发库的使用方法、程序设计技巧等方面的内容,力争完整讨论MP1规范所定义的各种特征。主要也括MPI环境下开发并行程序常用的方法、模式、技巧等 内容。在内容组织上力求全面综合地反映MPl-1和MPI-2规范。对MPI所定义的各种功能、特征分别

给出可验证和测试其工作细节的示例程序 目录 第1章 MPI并行环境及编程模型  1.1 MPICH2环境及安装和测试 1.1.1 编译及安装 1.1.2 配置及验汪 1.1.3 应用程序的编译、链接 1.1.4 运行及调试 1.1.5 MPD中的安全问题  1.2 MPI环境编程模型 1.2.1 并行系统介绍 1.2.2 并行编程模式 1.2.3 MPI程序工作模式  1.3 MPI消息传递通信的基本概念 1.3.1 消息 1.3.2 缓冲区 1.3.3 通信子 1.3.4 进样号和进程纰 1.3.5 通价胁议 1.3.6 隐形对象 第2章 点到点通信  2.1 阻糍通信 2.1.1 标准通信模式 2.1.2 缓冲通信模式 2.1.3 就绪通信模式 2.1.4 同步通信模式 2.1.5 小结  2.2 非阻塞通信 2.2.1 通信结束测试 2.2.2 非重复的非阻塞通信 2.2.3 可醺复的非阻塞通信 2.2.4 Probe和Cancel  2.3 组合发送接收 2.3.1 MPl_Send,MPI_RecvoMPl_Sendreev 2.3.2 MPI_Bsend←→MPl_Sendrecv 2.3.3 MPI_Rsend←→MPI_Sendrecv 2.3.4 MPl_Ssend←→MPl_Sendrecv 2.3.5 MPl_lsend←→MP1一Sendrecv 2.3.6 MPl_Ibsend←→MPI_Sendrecv 2.3.7 MPI_Irsend←→MPI_Sendrecv 2.3.8 MPl_Issend,MPI_Irecv←→MPI_Sendrecv 2.3.9 MPI Send_init←→MPl_Sendrecv 2.3.10 MPI一Bsendj init←→MPl_Sendrecv 2.3.11 MPI_Rsend_init←→MPI_Sendrecv 2.3.12 MPl_Ssend_init,MPl_Recv_init←→MPl_Sendrecv 2.4 点到点通信总结

程序设计方法与艺术 小组解题报告模板

程序设计方法与艺术实验报告 班级:0001班 指导老师:徐本柱 组长:2015211727 张家铭组员:2015211739 2015211744 2015211753

题目A旅行路线的数目 一个正方形的小镇被分成N2个小方格,Betsy要从左上角的方格到达左下角的方格,并且经过每个方格恰好一次。编程对于给定的N,计算出Betsy能采用的所有的旅行路线的数目 解题思路: 这道题目很明显是道搜索题,关键在于优化。而搜索题的优化主要就是剪枝。 首先很容易想到,因为Betsy是任意的走,当n取到5或6时,它的方案总数就已经很大了,方案数越是大,搜索时,不要用的枝就会越多,而且这些枝占方案总数的比例相当大。如果能知道什么情况下,会出现必然无解,就能很好的提高效率了。于是由此知道,此题用剪枝的方法做是正确的。 具体解法: 首先从题目的条件入手,题目要求每一个各自都必须走到,而且每一个格子只能走一遍。这两个条件就指出了这道题目的可剪的枝条中的两个。 然后从这两条出发,仔细分析一下,到底在什么情况下会不满足题目的要求。 第二个条件要求每个格子只能走一遍,这很简单,用一个数组记录一下到底有哪些格子是已经经过了的,那些是还没有经过的,在Betsy移动时,就只移动到那些还没有经过的格子中去,这样就避免了一个格子走两遍。 第一个条件要求每个格子都要经过一次,这是个很难满足的条件,有很多无解的情况就是因为不满足它,那到底有哪些情况会导致不满足着一个条件呢。比方说下面的几个图。图中箭头表示Betsy的行走路线。 如图1,其中的黄色区是不能达到的,如果到 达了黄色区,就别再想到最左下角了,因为, 这个区域只有一个入口,没有出口,进得去, 出不来。于是,就一般的情况来说,每一个还 没有到过得格子(除开终点)都必须要有两个 空格子与之相连接(Betsy当前所在的格子算是 个空格子),这样才能保证Betsy既可以移进这 个格子又可以移出这个格子。 图1 再如图2,其中的红色格子是不可能达到了, 虽然它满足每一个格子都有两个相邻的空格 子,但是,Betsy是不可能移动到这些红格子中 去了,这几个格子被隔断了。一般化,Betsy行 走的路径不能够圈出一个独立的块出来,否则 这一块是没有办法走到的。 图2 图2中的独立的一块要如何判断,难道要进行一次搜索求得?不。看一下的几种情况,仅当出现这几种情况时,会分割出一个独立的块。

分形几何与分形艺术

我们人类生活的世界是一个极其复杂的世界,例如,喧闹的都市生活、变幻莫测的股市变化、复杂的生命现象、蜿蜒曲折的海岸线、坑坑洼洼的地面等等,都表现了客观世界特别丰富的现象。基于传统欧几里得几何学的各门自然科学总是把研究对象想象成一个个规则的形体,而我们生活的世界竟如此不规则和支离破碎,与欧几里得几何图形相比,拥有完全不同层次的复杂性。分形几何则提供了一种描述这种不规则复杂现象中的秩序和结构的新方法。 一、分形几何与分形艺术 什么是分形几何?通俗一点说就是研究无限复杂但具有一定意义下的自相似图形和结构的几何学。什么是自相似呢?例如一棵苍天大树与它自身上的树枝及树枝上的枝杈,在形状上没什么大的区别,大树与树枝这种关系在几何形状上称之为自相似关系;我们再拿来一片树叶,仔细观察一下叶脉,它们也具备这种性质;动物也不例外,一头牛身体中的一个细胞中的基因记录着这头牛的全部生长信息;还有高山的表面,您无论怎样放大其局部,它都如此粗糙不平等等。这些例子在我们的身边到处可见。分形几何揭示了世界的本质,分形几何是真正描述大自然的几何学。 "分形"一词译于英文Fractal,系分形几何的创始人曼德尔布罗特(B.B.Mandelbrot)于1975年由拉丁语Frangere一词创造而成,词本身具有"破碎"、"不规则"等含义。Mandelbrot研究中最精彩的部分是1980年他发现的并以他的名字命名的集合,他发现整个宇宙以一种出人意料的方式构成自相似的结构(见图1)。Mandelbrot 集合图形的边界处,具有无限复杂和精细的结构。如果计算机的精度是不受限制的话,您可以无限地放大她的边界。图2、图3 就是将图1中两个矩形框区域放大后的图形。当你放大某个区域,它的结构就在变化,展现出新的结构元素。这正如前面提到的"蜿蜒曲折的一段海岸线",无论您怎样放大它的局部,它总是曲折而不光滑,即连续不可微。微积分中抽象出来的光滑曲线在我们的生活中是不存在的。所以说,Mandelbrot集合是向传统几何学的挑战。

并行程序设计

一、并行程序开发策略 1.自动并行化:有目的地稍许修改源代码 2.调用并行库:开发并行库 3.重新编写并行代码:对源代码做重大修改 二、并行编程模式 1.主从模式(任务播种模式):将待求解的任务分成一个主任务(主进程)和一些子任务 (子进程)。所考虑的因素是负载均衡,一般可以采用静态分配和动态分配两种方法。 2.单程序流多数据流(SPMD):并行进程执行相同的代码段,但操作不同的数据。 3.数据流水线:将各个计算进程组成一条流水线,每个进程执行一个特定的计算任务。 4.分治策略:将一个大而复杂的问题分解成若干个特性相同的子问题。 三、并行程序的编程过程(PCAM过程) 1.任务划分(Partitioning) 2.通信分析(Communication) 3.任务组合(Agglomeration):增加粒度和保持灵活性 4.处理器映射(Mapping):映射策略、负载均衡、任务的分配与调度(静态和动态) 动态调度:基本自调度(SS)、块自调度(BSS)、指导自调度(GSS)、因子分解调度(FS)、梯形自调度(TSS)、耦合调度(AS)、安全自调度(SSS)、自适应耦合调度(AAS) 串匹配问题是计算机科学中的一个基本问题,在文字编辑、图像处理等利于都得到了广泛的应用,串匹配算法在这些应用中起到至关重要的作用。因此研究快速的串匹配算法具有重要的理论和实际意义。 KMP是一种改进的字符串模式匹配的算法,他能够在o(m+n)时间复杂度内完成字符串的模式匹配算法。本文将详细的介绍KMP算法的思想,串行及并行实现。 一、KMP算法思想 1、问题描述 给定主串S[0...n-1]、模式串T[0...m-1],其中m<=n。在主串S中找出所有模式串T的起始位置。 2、算法思想 令指针i指向主串S,指针j指向模式串T中当前正在比较的位置。令指针i和指针j指向的字符比较之,如两字符相等,则顺次比较后面的字符;如不相等,则指针i不动,回溯指针j,令其指向模式串T的第pos个字符,使T[0...pos-1] == S[i-pos, i-1],然后,指针i和指针j所指向的字符按此种方法继续比较,知道j == m-1,即在主串S中找到模式串T为止。 从算法的思想思想中我们可以看出,其算法的难点在于如何求出指针j的回溯值,即:当指针j回溯时,j将指向的位置,我们几位next[j]。下面我们首先对kmp的算法做出详细的描述。 二、KMP算法描述 输入:主串S[0...n-1], 模式串T[0...m-1] 输出:m[0...n-1],当m[i] = 1时,则主串S中匹配到模式串,且i为起始位置 begin i = 0;j = 0; while(i < n) if(S[i] != T[j])

程序设计艺术与方法实验报告3

《程序设计艺术与方法》课程实验报告实验名称实验二搜索算法的实现 姓名系院专业计算机与 信息学院 班级学号 实验日期指导教师成绩 一、实验目的和要求 1.掌握宽度优先搜索算法 2.掌握深度优先搜索算法 二、实验预习内容 1.将书上的走迷宫代码上机运行并检验结果,体会搜索的思想 2.预习n皇后问题 3.预习骑士游历问题 三、实验项目摘要 1.n皇后问题: 在一个国际象棋棋盘上放n个皇后,使得任何两个皇后之间不相互攻击,求出所有的布棋方法。上机运行并检验结果 2.骑士游历问题: 在国际棋盘上使一个骑士遍历所有的格子一遍且仅一遍,对于任意给定的顶点,输出一条符合上述要求的路径 3.倒水问题: 给定2 个没有刻度容器,对于任意给定的容积,求出如何只用两个瓶装出L 升的水,如果可以,输出步骤,如果不可以,请输出No Solution 。 四、实验结果与分析(源程序及相关说明) N皇后问题代码 #include using namespace std; #include int sum = 0; int upperlimit = 1; void compare(int row,int ld,int rd){ if(row!=upperlimit){ Int pos=upperlimit&~(row|ld|rd);

while(pos!=0){ int p=pos&-pos;pos-=p; compare(row+p,(ld+p)<<1,(rd+p)>>1); }} else{sum++;}} int main(){int n; cout<<"请输入皇后的个数:"; cin>>n; upperlimit = (upperlimit<

《Java程序设计》课程教学标准

广东轻工职业技术学院 计算机工程系 计算机多媒体专业 课程教学标准 (2009年执行) 课程名称 JAVA程序设计 课程类型专业基础课程 授课对象计媒体091、092班 课程学分 5 总学时 90 二零一零年一月

一、课程学习定位 《JAVA程序设计》是计算机多媒体专业重要的专业必修课,是一门集技术、设计、实现于一体的综合性课程。目标是让学生具有根据软件项目的需求正确完成软件系统的功能设计与实现的能力。其先修课程是《计算机导论》,后续课程有《Web开发技术》、《Flash脚本语言》等。 二、课程的学习目标 通过学习Java基本语法、应用Java语言设计实现软件模块功能的相关知识,使学生理解Java技术的编程理念,掌握使用Java语言的编程方法,获得分析解决实际问题的基本能力,并通过实际项目的功能设计与实现,培养学生基于Java 进行项目开发的基本技能,并为下一阶段的Web开发和Flash脚本语言综合项目开发打下坚实的基础。 1.能力目标 (1)能够熟练运用Java语言实现程序功能; (2)能够熟练掌握Java开发工具和开发环境配置; (3)能够熟练掌握Java面向过程的开发方法; (4)能够基本建立面向对象的软件开发方法; (5)具备分析解决问题、自主学习的能力。 2.知识目标 (1)掌握Java平台开发环境的搭建与配置; (2)熟练掌握Java的开发平台和开发软件包,熟悉各种参数设置及利用其进行程序开发的方法; (3)熟练掌握Java语言的基本语法; (4)掌握Java类的概念、定义及创建类对象的方法; (5)掌握基于AWT的简单的可视化软件设计。 3.素质目标 (1)培养学生对程序设计的兴趣,充分发挥学生的自主学习能力; (2)培养学生的与人交流、与人合作及信息处理的能力; (3)培养学生分析问题、解决问题及创造思维能力; (4)培养学生严谨的工作作风。 三、课程学习设计理念和思路 1.设计理念 本课程以岗位需求为导向、遵循国际职业标准,以工作过程为依据选取教学内容,并充分考虑学生的学习特点和职业发展需要,基于工作过程设计和实施教学,充分调动学生的学习积极性。倡导以项目驱动教学,引导学生积极探索、自主学

函数也可以如此美丽-Julia集的分形艺术

函数也可以如此美丽——Julia集的分形艺术 微博:@月绒兔子 前言 大家在高中的时候都学过解析函数吧?说解析函数是不是有点显得太高端了?那好,给你一个y=x的函数,在XY坐标系上画出这个函数的图像。别告诉我你不会啊,这可是拿脚后跟都能画出来的图像啊。 闲话不多说了。首先,先声明下此文并不是给大家讲数学的,也不是专门给理工科童鞋看的。此文的目的就是想让大家知道,有那么一个函数,她是如此的奇幻如此的美丽多变,就像她的名字一样—Julia。然后我们用HTML5的canvas来召唤她。 先来几张Julia的芳容欣赏下: 没错,以上四个图片不是电脑桌面,但是它确实Julia集合(Julia Set)所描绘的抽象艺术。 Julia集简介 我是在一门叫做“高等统计物理”的课程上认识到Julia集的。虽然她的图像非常绚丽多姿,但其实她的真身非常简单,简单到你不敢想象: f(z)=z^2+C 其中,z^2表示z的平方,z和C均为复数(复习一下:复数就是a+ib,a为实部,b为虚部,i就是表示虚部的部分)。 然后我们做以下的迭代: Z1=f(z0) Z2=f(z1)

Z3=f(z2) Z4=f(z3) … 那么当Z0=0,C=0.5时 Z1=0^2+0.5=0.5 Z2=0.5^2+0.5=0.75 Z3=0.75^2+0.5=1.0625 Z4=1.0625^2+0.5=1.62890625 Z5=1.62890625^2+0.5=3.653355… Z6=Z5^2+0.5=14.346860796… 最终Zn趋于无限大。 同理,如果令Z0等于另一个值时,有可能会出现最终Zn收敛于某一值(无限趋近于某一个值),也有可能趋近无穷大,或者趋近无穷小(负值)。 Julia集绘制原理 上面的简介说明了其实Julia集就是一个迭代函数而已,那么,这么美丽的图像是怎么画出来的呢?其实很简单,刚才我有提到过,z和C都是复数,C是常量。 所以,z=x+iy,C=a+ib,图像是以x为横坐标,y为纵坐标绘制的。这么说来,只要随便改变a和b的值,就会出现不同的图案了。 那么图像中颜色是根据什么来的呢? 我们从画布左上角第一个像素(x=0,y=0)开始,这个像素所代表的物理意义就是,当z=0+i0(也就是z=0)时,进行Zn的迭代计算。我们预先设置一个阀值k(例如k=4),当计算到Z10的时候,发现Z10的模大于k了(|Z10|>k),就说明在迭代到第10次的时候发散了。依此类推,如果是计算到Z88的时候|Z88|>k了,就说明迭代到第88次的时候发散了。这时候你就可以按照你的口味来了,你可以设置为发散的越慢(迭代次数越多)颜色越深,发散的越快(迭代次数越少)颜色越浅。当然也可以用冷暖色系来表示。找到形成发散的迭代次数,就可以结束迭代运算了。 当然,有一点是要注意的,这个迭代在计算到很高阶的时候运算量可是会很大的哦,所以一定要设置一个迭代次数的最大值,比如,如果再迭代到300次的时候,|Zn|还没有大于阈值k,那就认为这个点永远不会发散了(可以叫做收敛点),直接停止迭代运算。这点的颜色就按迭代最大值时对应的颜色值来填充。 第一个点的绘制原理就是酱紫。下面就是要遍历所有的点,按照同样的方法让计算机去计算喽。如果你的画布是800x800,那就需要从(x=0,y=0)一直遍历到(x=800,y=800),一共是800x800=640000个点。如果你对你的电脑运算能力有信心的话,就可以利用Julia集绘制高分辨的HD桌面壁纸喽! Julia集的魅力所在 学术界对于Julia集的研究非常广泛,学者们深深被这个集合的美丽和规律所吸引。除了她的多变和美丽外,还有一个神奇的地方(不要跟太多人讲哦),就是她的分形艺术(fractal art)。

并行程序设计开题

并行程序设计开题报告 院系:信息技术科学学院 成员:王亚光2120100319 田金凤1120100119 题目:串匹配算法KPM和矩阵运算的并行算法实现与分析

1.文献综述 1.1消息传递并行程序设计(MPI)介绍 (1)M assage P assing I nterface:是消息传递函数库的标准规范,由MPI论坛开发,支持Fortran和C (2)一种新的库描述,不是一种语言。共有上百个函数调用接口,在Fortran 和C语言中可以直接对这些函数进行调用 (3)MPI是一种标准或规范的代表,而不是特指某一个对它的具体实 (4)MPI是一种消息传递编程模型,并成为这种编程模型的代表和事实上的标准 (5)指用户必须通过显式地发送和接收消息来实现处理机间的数据交换。 (6)在这种并行编程中,每个并行进程均有自己独立的地址空间,相互之间访问不能直接进行,必须通过显式的消息传递来实现。 (7)这种编程方式是大规模并行处理机(MPP)和机群(Cluster)采用的主要编程方式。 (8)并行计算粒度大,特别适合于大规模可扩展并行算法,由于消息传递程序设计要求用户很好地分解问题,组织不同进程间的数据交换,并行计算粒度大,特别适合于大规模可扩展并行算法。 (9)消息传递是当前并行计算领域的一个非常重要的并行程序设计方式。 (10)高可移植性。MPI已在IBM PC机上、MS Windows上、所有主要的Unix 工作站上和所有主流的并行机上得到实现。使用MPI作消息传递的C或Fortran 并行程序可不加改变地运行在IBM PC、MS Windows、Unix工作站、以及各种并行机上。 1.2串匹配算法 以字符序列形式出现而且不能将这些字符分成互相独立的关键字的一种数据称之为字符串(Strings)。字符串十分重要、常用的一种操作是串匹配(String Matching)。串匹配分为字符串精确匹配(Exact String Matching)和字符串近似匹配(Approximate String Matching)两大类。字符串匹配技术在正文编辑、文本压缩、数据加密、数据挖掘、图像处理、模式识别、Internet信息搜索、网络入侵检测、网络远程教学、电子商务、生物信息学、计算音乐等领域具有广泛的应用。而且串匹配是这些应用中最好时的核心问题,好的串匹配算法能显著的提高应用的效率。因此研究并设计快速的串匹配算法具有重要的理论价值和实际意义。 串匹配问题实际上就是一种模式匹配问题,即在给定的文本串中找出与模式串匹配的子串的起始位置。本文对已有的基于分布存储系统上的并行的串匹配算法(KMP)进行了分析和实现,并与串行的算法进行了比较。KMP算法首先是由D.E. Knuth、J.H. Morris以及V.R. Pratt分别设计出来的,所以该算法被命名为KMP算法。KMP串匹配算法的基本思想是:对给出的文本串T[1,n]与模式串P[1,m],假设在模式匹配的进程中,执行T[i]和P[j]的匹配检查。若T[i]=P[j],则继续检查T[i+1]和P[j+1]是否匹配。若T[i]≠P[j],则分成两种情况:若j=1,则模式串右移一位,检查T[i+1]和P[1]是否匹配;若1

《程序设计》教学案例

信息学科教学案例分析 ——C 语程序设计 湖南师范大学学工程与设计学院 二0一五年十二月 姓 名: 学 号: 专业: 钟智君 2013180502 计算机科学与技术 Hunan N ormal University

思路来源于生活──《程序设计》教学案例分析 【教学目标】 优点: 在本案例中,此教师对于教学目标把握的十分恰当。 1、老师所定的教学目标十分的适中。 因为老师对教学目标设定的十分合理,所以通过这节课的学习,同学们对知识点更加的理解,即减少了部分零基础同学因知识点不理解所带来的抵触情绪,又加深了同学对知识点的记忆。所定目标能够比较轻松的完成。 2、对于教学重点把握准确。这一堂课主要是向学生们讲解循环的基本思想,朱老师通过一些生活中的例子简单而深刻的给我们展现了循环到底是什么,他的基本原理是什么。 3、比较有针对性。 不足: 虽然老师对目标把握的比较好,但是仍有存在着部分不足。 1、主客体颠倒。目标中出现了大量的让学生、培养学生等字眼,这是十分不合理的,学生才算这个目标的重点,应该把学生放在第一位。 2、目标不太直观。我在看教学目标时,总是带着一个疑问,那就是这堂课到底是做什么的,看了很久才知道是对循环基本原理的讲授,而且三维目标区分的不太清楚。 【教学环节】 优点: 对于这堂课,教学环节的设计不得不说十分合理。整个教学过程不管是对于老师又或者对于学生都是十分轻松的。 1、能充分吸引学生注意力。作为一堂新课,尤其以前面的导入环节形象而生动,利用一个游戏式样的比喻,和课堂紧密结合,十分具有代入感,能够很好的吸引学生的注意力。 2、营造了一个轻松的教学环境。以同学们身边的一个例子轻松简单的渡过,一步一步引导学生步入主题,不断的深化教学,不知不觉同学们就把上课的所有

程序设计艺术与方法

程序设计艺术与方法 实验一STL 得熟悉与使用 1. 实验目得(1)掌握C++中STL得容器类得使用。(2) 掌握C++中STL得算法类得使用。 2. 试验设备硬件环境:PC 计算机软件环境: 操作系统:Windows2000 / WindowsXP/ Linux 语言环境:Dev cpp/ gnu c++ 3. 试验内容(1) 练习vector与list 得使用。定义一个空得vector,元素类型为int,生成10个随机数插入到vector中,用迭代器遍历vector 并输出其中得元素值。在vector 头部插入一个随机数,用迭代器遍历vector并输出其中得元素值。用泛型算法find 查找某个随机数,如果找到便输出,否则将此数插入vector 尾部。用泛型算法sort将vector 排序,用迭代器遍历vector 并输出其中得元素值。删除vector 尾部得元素,用迭代器遍历vector 并输出其中得元素值、将vector 清空。定义一个list,并重复上述实验,并注意观察结果。(2) 练习泛型算法得使用。 - 149 定义一个vector,元素类型为int,插入10 个随机数,使用sort 按升序排序,输出每个元素得值,再按降叙排序,输出每个元素得值。练习用find查找元素。用min 与max找出容器中得小元素个大元素,并输出、 源代码: #include #include #include<iomanip〉 #include::iterator it1; for(it1=myV。begin();it1!=myV。end();it1++) { cout<<(*it1)〈

程序设计艺术与方法

程序设计艺术与方法 实验一STL 的熟悉与使用 1.实验目的(1)掌握C++中STL 的容器类的使用。(2)掌握C++中STL 的算法类的使用。 2.试验设备硬件环境:PC 计算机软件环境:操作系统:Windows 2000 / Windows XP / Linux 语言环境:Dev cpp / gnu c++ 3.试验容(1) 练习vector 和list 的使用。定义一个空的vector,元素类型为int,生成10 个随机数插入到vector 中,用迭代器遍历vector 并输出其中的元素值。在vector 头部插入一个随机数,用迭代器遍历vector 并输出其中的元素值。用泛型算法find 查找某个随机数,如果找到便输出,否则将此数插入vector 尾部。用泛型算法sort 将vector 排序,用迭代器遍历vector 并输出其中的元素值。删除vector 尾部的元素,用迭代器遍历vector 并输出其中的元素值。将vector 清空。定义一个list,并重复上述实验,并注意观察结果。(2) 练习泛型算法的使用。 - 149 定义一个vector,元素类型为int,插入10 个随机数,使用sort 按升序排序,输出每个元素的值,再按降叙排序,输出每个元素的值。练习用find 查找元素。用min 和max 找出容器中的小元素个大元素,并输出。 源代码: #include #include #include #include #include using namespace std; vector myV; bool sortup(int v1,int v2) {

分形与幽默艺术

分形与幽默艺术 分形与幽默艺术 作者:憔悴太子 ── 从赵本山的小品《心病》谈起 摘要表演艺术本身就有着自己的规律与理论。研究分形与幽默,研究分形与表演艺术之间的关系,只不过是从一个从新的角度来进一步了解及研究表演艺术它的自身规律与理论,将原来看到的,还有可能看不到的和遗漏的,或者看不清楚的问题及内容,从理论与技术上进一步进行归纳与升华成为应用价值的东西,从而形成新的规律与理论。并用它来指导表演艺术的编导与表演艺术的实践。从赵本山的小品《心病》谈起, 研究分形与幽默的目的就在于希望本文能起抛砖引玉的作用。 关键词分形自相似性表演艺术幽默 一前言 2003春节晚会上赵本山的小品“心病”(何庆魁先生等撰写),由赵本山、高秀敏、范伟组成的“黄金铁三角” 重新杀回央视,成为最大的看点和亮点。小品“心病”在舞台演出需要的时间很短(网上下载赵本山的“心病”播放时间为13分54秒),然而观众的笑声不断共计有25次之多(除“黄金铁三角”的人物出场时深受观众欢迎,引起观众大笑叫好外,其中还有15次也是大笑与幽默喜剧的高潮),足见其成功之处。他们获得非常好的幽默喜剧效果与巨大轰动效应。该小品最典型的幽默是赵本山这个“医生”与“病人”范伟一样都得了相似的“心病”。对于身外之物的“钱”的“心病”上,“医生”治好了“病人”的“心病”,他自己却是同样的“心病”大发其着,而且更为甚之。正是赵本山这个“医生”与“病人”范伟一样都得了相似的“心病”才引发了幽默喜剧的效果,也正是这个幽默喜剧情节才引发了一些不必要的争论。其实艺术上的“相似”的故事情节,“相似”表现手法的相互借鉴是无可非议的,因为世界上从时间与空间的整体来看每时每刻不知要发生多少“相似”,“相同”的事情,这是不足为奇的。世界本来就是“分形”的世界。 从现在的观点来看,赵本山的小品“心病”他们获得非常好的幽默喜剧效果与巨大轰动效应,除了他们的表演技巧外,小品剧情的发展与表现技巧都应用了“分形”这一手法。这里我们只不过是从一个从新的角度来进一步了解及研究表演艺术而已。 二分形简介 “分形”(f ractal)这个名词是由美国IBM(International Business Machine)公司研究中心物理部研究员暨哈佛大学数学教授曼德勃罗特(Benoit B. Mandelbort)在1975年首次提出的,其原意是“不规则的,分数的,支离破碎的”物体,这个名词是参考了拉丁文f ractus(弄碎的)后造出来的,它既是英文又是法文,既是名词又是形容词。1977年,他的所撰写的世界第一部关于“分形”的著作“分形:形态,偶然性和维数”(Fractal:From, Chance and Dimension),标志着分形理论的正式诞生。五年后,他又出版了著名的专著“自然界的分形几何学”(The Fractal Geometry of Nature),至此,分形理论初步形成。由于他对科学作出的杰出的贡献,他荣获了1985年Barnard奖,该奖是由全美科学院推荐,每五年选一人,是非常有权威性的奖。在过去的获奖者中,爱因斯坦名列第一,其余的也都是著名的科学家。 分形理论诞生后,人们意思到应该把它作为工具,从新的角度来进一步了解及研究自然界和社会,范围包括所有的自然科学和社会科学领域。[1] (张济忠<<分形>> 清华大学出版社1995年8月第一版绪论pⅧ-Ⅸ) 分形的几个特点: (1) 具有无限精细的结构; (2) 比例自相似性; (3) 一般它的分数维大于它的拓扑维数; (4) 可以由非常简单的方法定义,并由递归,迭代产生等。 这里(1)(2)两项说明分形在结构上的内在规律性。自相似性是分形的灵魂,它使得分形的任何一个片段包含整个分形的信息。第(3)项说明了分形的复杂性,第(4)项说明了分形的生成机制。[2](分形--自然几何.htm)请看图1中的几个图形,它们叫做科赫曲线和科赫雪花曲线,从它的任何一个局部经过放大,都可以得到一个局部和整体自相似的图形。这就是分形几何的一个特点叫做自相似性。并且具有无限精细的结构,即它的全息性。从图1中,可以看出它的生成规律,即其递归过程。[3](分形艺术欣赏.htm)[4](21ic_com

相关文档
相关文档 最新文档