頗具藝術感的程式碼
程式設計真是蘊藏著無窮的想象,好的程式設計師就像藝術家一樣雕刻他的程式碼,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;
}
}
}
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);
}
}
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;
}
真是巧思,是不是藝術品,由君思考。
[@more@]來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7406370/viewspace-915908/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 《修改程式碼的藝術》迷你書
- 編寫可讀程式碼的藝術
- 又是一年D2:頗具匠心的中臺技術修養
- 前端開發中的程式碼藝術(精要)前端
- 讀《編寫可讀程式碼的藝術》
- 編寫可讀性程式碼的藝術
- 保護C#程式碼的藝術:深入淺出程式碼混淆技術C#
- 程式碼審查的藝術:Dropbox 的故事
- 程式設計,不止有程式碼,還有藝術程式設計
- 『No22: 編寫可讀程式碼的藝術(1)』
- 程式碼複用:DDD視角下的平衡藝術
- 《oracle效能優化科學與藝術》的讀後感Oracle優化
- 程式碼的藝術:如何寫出小而清晰的函式函式
- 如何提高程式碼的可讀性? - 讀《編寫可讀程式碼的藝術》
- Redux中的程式設計藝術Redux程式設計
- 優秀程式設計的“藝術”程式設計
- 程式碼藝術(程式設計師值得一看) (轉)程式設計師
- Linux Kernel程式碼藝術——陣列初始化Linux陣列
- Linux Kernel 程式碼藝術——編譯時斷言Linux編譯
- 載入非同步指令碼的藝術非同步指令碼
- 《JavaScript DOM程式設計藝術》作者談:原型程式碼與生產程式碼之間的矛盾JavaScript程式設計原型
- Michael Feathers:程式設計的藝術程式設計
- Java併發程式設計的藝術Java程式設計
- QT QML模組的程式設計藝術QT程式設計
- [iOS]藝術二維碼之路iOS
- 程式設計藝術家之路程式設計
- 加密的藝術加密
- 想寫無Bug的安全程式碼?看防禦性程式設計的藝術程式設計
- 程式設計師和程式藝術家程式設計師
- 《程式設計師程式設計藝術》程式設計師
- Java併發程式設計藝術Java程式設計
- 談UIView Animation程式設計藝術UIView程式設計
- 計算機程式設計藝術計算機程式設計
- 技術選型的藝術
- 其他感興趣的程式碼庫
- 命令列的藝術命令列
- 授權的藝術
- 讀《軟體驅魔》除錯和優化遺留程式碼的藝術除錯優化