2016-04-20 7 views

答えて

8

も、butlastは、あなたが彼らのソースを見れば論理的である、劇的に高速です:

(def 
butlast (fn ^:static butlast [s] 
      (loop [ret [] s s] 
      (if (next s) 
       (recur (conj ret (first s)) (next s)) 
       (seq ret))))) 

(defn drop-last 
    ([s] (drop-last 1 s)) 
    ([n s] (map (fn [x _] x) s (drop n s)))) 

butlastrecurとの単純な反復処理を使用しながら、そうdrop-lastは、mapを使用しています。ここに少しの例があります:

user> (time (let [_ (butlast (range 10000000))])) 
"Elapsed time: 2052.853726 msecs" 
nil 

user> (time (let [_ (doall (drop-last (range 10000000)))])) 
"Elapsed time: 14072.259077 msecs" 
nil 

私は盲目的に1つを優先しています。私はdrop-lastを使用するのは、私が本当に怠惰が必要な場合のみです。それ以外の場合はbutlastです。

4

はい、怠惰であり、実際にはdrop-lastも、nをとることができます。これは、最後から怠惰にいくつの要素をドロップするかを示します。

誰かがbutlastをより読み、多分Lispプログラマのための身近なイディオムですが、私は一般的にちょうどdrop-lastを使用することを選ぶというケースを作って議論hereがあります。あなたは全体のコレクションを実現する必要がある場合