2014-07-10 29 views
1

我學習的Clojure和我寫了這個代碼來解決羅馬數字卡塔:羅馬數字卡塔用Clojure

(def romans (sorted-map-by > 
      1000 "M" 
      500 "D" 
      400 "CD" 
      100 "C" 
      90 "XC" 
      50 "L" 
      40 "XL" 
      10 "X" 
      9 "IX" 
      5 "V" 
      4 "IV" 
      1 "I")) 

(defn roman-digit [arabic] 
    (first (filter (fn [[key value]] 
      (>= arabic key)) romans))) 

(defn arabic-to-roman [arabic] 
    (def roman (roman-digit arabic)) 
    (if (> arabic 0) 
    (apply str (val roman) (arabic-to-roman (- arabic (key roman)))) 
    "")) 

我想知道我怎麼能得到這個代碼更高效/成語/清潔。我相信我能學到很多新東西。

謝謝。

+3

使用let而不是def在阿拉伯語 - 羅馬函數中 – KobbyPemson

+2

您應該在[Code Review](http://codereview.stackexchange.com)上發佈此內容。 –

+2

此問題在4clojure上可用。跟隨一些頂級用戶併發布您的解決方案以查看他們的。 –

回答

2

這是我的刺傷。

(defn roman-digit [arabic] 
    (first 
    (filter #(>= arabic (first %)) 
     [[1000 "M" ] 
     [500 "D" ] 
     [400 "CD"] 
     [100 "C" ] 
     [90 "XC"] 
     [50 "L" ] 
     [40 "XL"] 
     [10 "X" ] 
     [9 "IX"] 
     [5 "V" ] 
     [4 "IV"] 
     [1 "I" ]]))) 

(defn arabic-to-roman [arabic] 
    (when (> arabic 0) 
    (let [[arabic-diff roman] (roman-digit arabic)] 
     (apply str roman (arabic-to-roman (- arabic arabic-diff)))))) 

這是怎麼回事?

  • 如果您有一個有序的封閉值集合,您最終仍然將其用作順序,那麼使用正確順序的矢量對需要更少的典禮。
  • 從來沒有做過def像這樣的條件。將def想象爲全局變量(符號)的聲明和定義。對於本地範圍(綁定)使用let
  • 首選when高於if特別是如果只有一個分支。請注意,strapply都爲nil做了正確的事情(當​​爲0時,它在遞歸的底部返回)。
+0

謝謝你的男人。真的很有見地。 –