漂亮代码
来源:互联网 发布:sql 相同数据合并累加 编辑:程序博客网 时间:2024/04/29 22:20
漂亮代码
从 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;
}
}
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);
}
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;
}
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)))))
0 0
- 漂亮代码
- 漂亮代码
- 漂亮代码
- 也谈漂亮代码
- 让代码更漂亮
- 漂亮的代码
- 前端漂亮分页代码
- 一个漂亮JS日期代码
- 如何写出漂亮的代码
- 要写漂亮的代码
- 要写漂亮的代码
- 漂亮代码的七个原则
- CSS漂亮搜索框代码
- 非常漂亮日历JS代码
- 一个漂亮的小键盘代码
- “写出漂亮美丽的代码”
- 写出漂亮的java代码
- sicp1-3 漂亮的代码
- 怎么使用PHPMailer实现邮件的发送??
- 初学 c语言 关于指针------什么是指针 int *a 与 *a的区别
- tomcat修改java不重启
- [LeetCode] Roman to Integer || Integer to Roman (JAVA)
- 数据结构第三章栈的基本操作
- 漂亮代码
- jquery中使用event.target的几点
- CentOS设置上网代理
- Java中有关变量初始化先后顺序的思考和实验(三)
- pypy install 安装 gevent 安装
- Java 反射机制[Field反射]
- nike free run 98ca hyfS jTgVE
- ugg boots g��nstig QxZP AX4h gESSM
- nike australia rMEd xKpC EKncW