漂亮代码

来源:互联网 发布:程序员黄历图片 编辑:程序博客网 时间:2024/04/29 23:51

从 Joe Marshall论证编程是艺术的文章上看到的。编程到底是不是艺术已经快变成继编程语言和Emacs vs Vi之后另一Flame War话题。有兴趣的可以去看reddit的讨论。有意思的是一段漂亮的代码,实现SICP上一坨练习题1.3:

实现一个带三个参数的函数。这个函数返回三个参数中最大的两个参数的平方和。

题目用来训练学生对条件分支的理解。常规的解法是(迎合一下各位老大,改成C了):

int sum_square_largest(int x, int y, int z){
    
if(y > x && z > x){
        
return y * y + z * z;
    }

    
if(x > y && z > y){
        
return x * x + z * z;
    }

    
if(x > z && y > z){
        
return x * x + y * y;
    }
}

但Joe老大给出了一个非常漂亮的解法。简洁直观,巧妙地利用递归大幅简化判断。

int sum_square_largest(int x, int y, int z){
    
if (x <= y && x <= z){
        
return y * y + z * z;
    }

    
return sum_square_largest(y, z, x); 
}

这段代码符合Joe对判断一件作品是否是艺术的四个标准:

  • 这段代码非人不能写出,富于想象力。
  • 这段代码除了实现既定功能外,具有高度的表现力。
  • 这段代码很美。
  • 这段代码传递的美感和思想超越了它自身。

Joe Garvin给出了另外一个解法,不过没有Marshall的直观漂亮:

int sum_square_largest(int x, int y, int z){
    
if(x <= z) return sum_square_largest(z, y, x);
    
if(y <= z) return sum_square_largest(x, z, y); 

    
return x * x + y * y;
}

 

坚持要上Scheme的老大们,这里是原文里的代码:

(define (sum-square-largest x y z)  (cond ((and (> y x) (> z x)) ;; y and z are largest         (+ (* y y) (* z z)))        ((and (> x y) (> z y)) ;; x and z are largest         (+ (* x x) (* z z)))        ((and (> x z) (> y z)) ;; x and y are largest         (+ (* x x) (* y y)))))
(define (sum-square-largest x y z)  (cond ((and (< x y) (< x z)) ;; x is smallest         (+ (* y y) (* z z)))        (else (sum-square-largest y z x))))
(define (sls x y z)    (cond ((> z x) (sls z y x))          ((> z y) (sls x z y))          (else (+ (* x x) (* y y)))))
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 银行转账到别人账户怎么办 银行转账转错账户怎么办 人已故欠的公款怎么办 论文抄了表格数据怎么办 电子转账转错了怎么办 苹果手机付款方式有问题怎么办 合同中付款方式错怎么办? 优步付款方式无效怎么办 工程付款方式变更没有合同怎么办 银行账号被锁了怎么办? 街电押金退不了怎么办 佣金宝账号忘了怎么办 如果汇款汇错了怎么办 手机汇款汇错了怎么办 汇款时少了数字怎么办 打过流脑后发烧怎么办 甲醛公司除完后怎么办 发票系统导出的xml 怎么办 新买的书包味道太大怎么办 alt+a截图热键冲突怎么办 白背心领发黄了怎么办 房屋装修后出现质量问题怎么办 华为p9手机音量小怎么办 华为畅享8玩游戏卡怎么办 华为畅享7玩游戏卡怎么办 华为p9升级以后屏幕失灵怎么办 荣耀9青春版玩游戏卡怎么办 华为p9屏幕不亮了怎么办 华为p9入水黑屏怎么办 农信密码忘记了怎么办 小米4g信号差怎么办 手机的调频调制器坏了怎么办 调制解调器的灯一直闪怎么办 691宽带用户名和密码无效怎么办 房间里有狐臭味怎么办 吃冰冻水果胃特别痛怎么办 小米5s屏幕闪烁怎么办 系统重装重启了怎么办 华为p10开不了机怎么办 眼镜腿夹的头疼怎么办 摩托车车头锁坏了怎么办