1701010112
我和数学有约:趣味数学及算法解析 9.1 百花齐放之程序之美
1701010113
1701010114
程序的美要从两个方面进行品味,一是程序整体的架构之美;二是程序的代码实现之美。
1701010115
1701010116
(1)编码之美
1701010117
1701010118
编程就是利用计算机写出具体的实现流程代码,以解决问题的方法。
1701010119
1701010120
刚开始,新手总是把代码全部写在main()函数里,然后逐渐地过渡到把一些有独立意义的代码片断写到不同的函数文件里,以供调用;新手从不知道代码的可移植性,直到渐渐地把可移植性的代码抽象出来应用到不同的问题中;从类与类之间没有什么组织结构,直到渐渐地把程序中的类组织成不同的目录结构,让不同的类担当不同的责任。这个时候,我们将第一次和可控逻辑程序设计沾边。
1701010121
1701010122
代码之美还有很具体的地方,实现同样的功能,有人做不出来,有人用1天写出1千行的实现方案,需要运行1s即解决问题,有人用10天写出1万行的实现方案,只要运行0.01s就能解决问题。
1701010123
1701010124
通常来说,要解决一个问题,人做的工作越多,计算机做的工作就越少;思维越缜密,就越能减少程序出现的bug,同样,代码长度也就越长。一万行的程序不一定比一千行的程序运行地慢。
1701010125
1701010126
说起代码之美,我想起Mathworks的一个程序设计挑战赛:找出集合中求和是原集合所有元素之和一半的子集合。
1701010127
1701010128
我见过的最牛的实现(来自波士顿大学神经科学方面的高级研究科学家):
1701010129
1701010130
function ans = split_itn(x) x; while dot(x,~ans-ans) rand(size(x)>.5); end end
1701010131
1701010132
当然国内也有大神设计如下:
1701010133
1701010134
function ans = split_it(x) bintprog([],[],[],x,sum(x)/2)
1701010135
1701010136
代码之美还体现在很多地方,比如说优秀的算法、命名规范和代码格式等等。
1701010137
1701010138
(2)架构之美
1701010139
1701010140
好的架构是系统成功的一大半,有了好的架构,实现起来只有好坏之分,基本不存在能不能实现的问题。对系统进行架构的过程就是对现实世界中的事物和过程进行抽象的过程,抽象越接近事实的本质,适应性越强,系统的生命力也就越强。
1701010141
1701010142
系统架构这个东西,笔者认为首先应该学习理论知识,学习成功案例,多想想“如果是自己会怎么办”,有机会自己要多实践,理论联系实践是最重要的。同时还要多思考,思考事物之间的关系,将它们抽象成计算机可以表示、可以处理的模型。
1701010143
1701010144
阅读优美的代码,体味优美的架构,一种思想的美总能止不住的从心中油然而生,如同醍醐灌顶。
1701010145
1701010146
下面领略一个采用MATLAB设计的百花齐放程序:
1701010147
1701010148
clc,clear,close all %清屏和清除变量 warning off %消除警告 hf=figure(‘name’,‘百花争艳图’); axis([0 22 0 16]); %显示范围 axis equal title(‘百花歌盛世’); axis off hold on %保持图形句柄 %%%%%%%%%%%%画树干 gx=[0 1 2 3 4 4.2 5 5.1 6 7 8 8.2 8.7 9 9.2 10 10.5 11 11.5 11.7 12.3 12.5 13 13.5 14]; gy=[0 1.8 3.1 3.3 3.8 3.9 4 4.05 4.1 4.3 4.55 4.6 4.75 5 5.65 6.2 6.8 7.4 8 8.4 9 9.3 9.87 10.25 10.8]; p=polyfit(gx,gy,4); %拟合 gxx=linspace(0,16,100); %均匀划分区间 gyy=polyval(p,gxx); %多元函数赋值 plot(gxx,gyy,‘linewidth’,5,‘color’,[0.1 0.9 0]); %画图—树干 c1x=[2 2.3 2.5 2.6 2.55 2.5 2.4 2.3 2.2 2.1 1.8 1.5 1.2]; c1y=[3.1 3.7 4.1 5 5.4 5.6 5.8 5.9 6 6.1 6.3 6.8 7.2]; plot(c1x,c1y,‘linewidth’,2.5,‘color’,‘c’); %画图—树枝 c1x1=[2.5 2.6 2.7 2.8 2.9 3 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8]; c1y1=[4.1 4.4 4.6 4.85 5 5.2 5.3 5.4 5.55 5.6 5.7 5.76 5.82 5.9]; plot(c1x1,c1y1,‘linewidth’,2.5,‘color’,‘r’); %画图—树枝 c2x=[4 4.3 4.4 4.5 5 5.1 5.3 5.5 5.6 5.8 6 6.3 6.6 6.8 7 7.1 7.2 7.3 7.5 7.7 7.9 8 8.1 8.2 ]; c2y=[3.78 3.78 3.75 3.73 3.7 3.68 3.67 3.6 3.58 3.54 3.5 3.4 3.3 3.15 3 2.9 2.8 2.7 2.5 2.35 2.1 2 1.8 1.6]; plot(c2x,c2y,‘linewidth’,2.5,‘color’,‘b’); %画图—树枝 c3x=[4.8 5.1 5.2 5.3 5.5 5.7 5.8 5.9 6 6.1 6.2 6.4 6.5 6.6 6.65 6.66 6.67 6.68 6.69 6.7 6.65 6.6 6.55 6.5 6.45 6.4]; c3y=[3.85 4.05 4.1 4.17 4.3 4.6 4.74 4.96 5.1 5.4 5.5 6 6.2 6.66 6.76 6.86 7 7.1 7.2 7.4 7.55 7.68 7.8 8 8.1 8.2]; plot(c3x,c3y,‘linewidth’,2.5,‘color’,‘r’); %画图—树枝 c3x1=[6.1 6.2 6.17 6.15 6.1 6.05 6 5.9 5.8 5.6 5.5 5.4 5.3 5.2 5.1 5 4.9 4.8 4.7 4.6 4.5 4.2 4]; c3y1=[5.4 5.5 5.6 5.65 5.7 5.8 6 6.2 6.45 6.8 6.93 7.08 7.2 7.3 7.4 7.5 7.51 7.52 7.7 8 8.5 9 9.5]; plot(c3x1,c3y1,‘linewidth’,2.5,‘color’,‘g’); %画图—树枝 c3x2=[5.9 6 6.1 6.2 6.4 6.5 6.6 6.7 6.8 6.9 7 7.1 7.2 7.3 7.4 7.5 7.6]; c3y2=[4.96 5.05 5.15 5.27 5.54 5.67 5.8 6 6.08 6.2 6.3 6.4 6.5 6.62 6.7 6.8 6.85]; plot(c3x2,c3y2,‘linewidth’,2.5,‘color’,‘b’); %画图—树枝 c5x=[5.3 5.5 5.7 5.8 5.9 6 6.1 6.2 6.4 6.5 6.6 6.65 6.66 6.67 6.68 6.69 6.7 6.65 6.6 6.55 6.5 6.45 6.4]+3.6; c5y=[4.11 4.3 4.6 4.74 4.96 5.1 5.4 5.5 6 6.2 6.66 6.76 6.86 7 7.1 7.2 7.4 7.55 7.68 7.8 8 8.1 8.2]+1.2; plot(c5x,c5y,‘linewidth’,2.5,‘color’,‘m’); %画图—树枝 c5x1=c3x1+3.6; c5y1=c3y1+1.2; plot(c5x1,c5y1,‘linewidth’,2.5,‘color’,‘c’); %画图—树枝 c4x=[8.2 8.5 9 9.5 10 10.2 ]; c4y=[4.6 4.4 4.2 3.7 3.3 3 ]; p4=polyfit(c4x,c4y,4); c4xx=linspace(8.2,12.2,20); c4yy=polyval(p4,c4xx); plot(c4xx,c4yy,‘linewidth’,2.5,‘color’,‘g’); %画图—树枝 c4x1=[8.9 9 9.1 9.2 9.3 9.5]; c4y1=[2.8 2.85 2.9 3 3.1 3.7]; p41=polyfit(c4x1,c4y1,4); c4xx1=linspace(8.9,9.5,20); c4yy1=polyval(p41,c4xx1); plot(c4xx1,c4yy1,‘linewidth’,2.5,‘color’,‘m’); %画图—树枝 c4x2=[9.5 9.8 10.4 10.7 10.8 11 12]; c4y2=[3.7 3.68 3.64 3.6 3.7 3.8 3.9]; p42=polyfit(c4x2,c4y2,4); c4xx2=linspace(9.5,12,20); c4yy2=polyval(p42,c4xx2); plot(c4xx2,c4yy2,‘linewidth’,2.5,‘color’,‘k’); %画图—树枝 c6x=[10.5 11 11.5 12 12.5 13 13.5 14]; c66y=[6.3 6.4 6.67 6.9 7.2 7.5 7.9 8.3]+0.5; c6y=c66y; p6=polyfit(c6x,c6y,4); c6xx=linspace(10.5,14,20); c6yy=polyval(p6,c6xx); plot(c6xx,c6yy,‘linewidth’,2.5,‘color’,[0.2 0.6 0]); %画图—树枝 c6x1=[12 12.5 13 13.3 13.5 13.7 14]; c66y1=[6.9 6.86 6.8 6.7 6.6 6.4 6]+0.5; c6y1=c66y1; p61=polyfit(c6x1,c6y1,4); c6xx1=linspace(12,14.5,20); c6yy1=polyval(p61,c6xx1); plot(c6xx1,c6yy1,‘linewidth’,2.5,‘color’,[0.7 0.2 0.1]); %画图—树枝 c7x=[11.9 12 12.2 12.54 12.8 12.9 13]; c77y=[8.1 8.5 9 10 10.5 11 12]+0.4; c7y=c77y; p7=polyfit(c7x,c7y,4); c7xx=linspace(11.9,13,20); c7yy=polyval(p7,c7xx); plot(c7xx,c7yy,‘linewidth’,2.5,‘color’,[1 0 0]); %画图—树枝 %%%%%%%%%%%%%%%%%%%以上为画的树干 %%%%%%%%%%%%%%%%%各顶点 dc1x=1.2; dc1y=7.2; dc2x=8.2597; dc2y=1.5469; dc3x=6.4016; dc3y=8.1662; dc4x=12.2097; dc4y=1.7260; dc5x=9.9726; dc5y=9.3565; dc6x=13.9210; dc6y=8.7469; dc7x=12.9919; dc7y=12.3469; dgx=16.0694; dgy=11.3598; dc1x1=3.7016; dc1y1=5.8436; dc3x1=4; dc3y1=9.5; dc4x1=8.9274; dc4y1=2.7952; dc5x1=7.5645; dc5y1=10.6292; dc6x1=14.5323; dc6y1=5.2099; dc3x2=7.5629; dc3y2=6.8017; dc4x2=11.9758; dc4y2=3.9275; %%%%%%%%%%%%%%%画各顶点 %%%%画花 %15 aa15=linspace(0,4*pi,600); a15=aa15+pi/4; phi15=3*sin(a15)+3.5*cos(10*a15).*cos(8*a15); x15=phi15.*cos(aa15)/2+dgx; y15=phi15.*sin(aa15)/2+dgy; plot(x15,y15,‘color’,[1 0 0],‘linewidth’,1.5); %画花 %15 %14 t14=linspace(0,1,3000); r14=t14*20; a14=t14*360*90; b14=t14*360*10; x14=r14.*sind(a14).*cosd(b14)/8+dc7x; y14=r14.*sind(a14).*sind(b14)/8+dc7y; plot(x14,y14,‘
1701010149
1701010150
运行程序输出图形如图9-1所示。
1701010151
1701010152
1701010153
1701010154
1701010155
图9-1 百花齐放
1701010156
1701010157
程序流程相当清晰,首先是把主树枝干画出来,然后开始着手画树枝;树枝画好后,表现出来的就是树枝端点还悬空,因此逐步地在每一个树枝头顶点,进行不同样式的花布置;花布置完后,图形基本很漂亮了,程序架构也基本完成。大家也可以人为的添加一些其他的附属产物,如图9-1所示的蝴蝶、兔子和月亮等,使得整个图像更加和谐。
1701010158
1701010159
程序之美,数学之美,用心去做,难者亦易矣。
1701010160
[
上一页 ]
[ :1.701010111e+09 ]
[
下一页 ]