漂亮代码

从 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)))))
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 13
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值