打字猴:1.701010103e+09
1701010103 我和数学有约:趣味数学及算法解析 [:1701004267]
1701010104 我和数学有约:趣味数学及算法解析 第9章 程序之美
1701010105
1701010106 当涉及到具体的工程问题时,我们的理论推导很关键,但是理论推导过后,程序设计往往能够起到很重要的作用,好的程序设计能够很好地求解理论表达式,得到最优结果,也就是我们需要完好的组织程序结构——程序架构之美。
1701010107
1701010108
1701010109
1701010110
1701010111 我和数学有约:趣味数学及算法解析 [:1701004268]
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
[ 上一页 ]  [ :1.701010103e+09 ]  [ 下一页 ]