頗具藝術感的程式碼

longtrue發表於2007-05-22

程式設計真是蘊藏著無窮的想象,好的程式設計師就像藝術家一樣雕刻他的程式碼,keyboard就是羅丹手中的小刀,一行行的程式碼就是陳列著的雕像。

程式設計到底是不是藝術已經快變成繼程式語言和Emacs vs Vi之後另一Flame War話題。有興趣的可以去看。且看Joe Marshall論證一段程式碼。

實現一個帶三個引數的函式。這個函式返回三個引數中最大的兩個引數的平方和。

題目用來訓練學生對條件分支的理解。常規的解法是

(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)))))

改成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老大給出了一個非常漂亮的解法。簡潔直觀,巧妙地利用遞迴大幅簡化判斷。

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))))

改成c就是:

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;
頗具藝術感的程式碼}

真是巧思,是不是藝術品,由君思考。

[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7406370/viewspace-915908/,如需轉載,請註明出處,否則將追究法律責任。

相關文章