2017-11-27 4 views
0

私はClojureの初心者です。エラーの意味を解読することはできません。ループ内で最小の数を連続して見つけるには

(defn find-min 
    [nums] 
    (loop [smallest 1000000 i 0] 
    (if (= (count nums) i) 
     smallest) 
    (if (< (nums i) smallest) 
     (recur (nums i) (inc i)) 
     (recur smallest (inc i))))) 


(find-min [3 4 0 2]) 

はIndexOutOfBoundsException clojure.lang.PersistentVector.arrayFor(PersistentVector.java:158)

今、私はそこにインデックスがバインドされたエラーの外にあるが、最初のかの機能があることに注意してかかることを理解してください関数はなぜそれが起こっているかを返します?

+0

に 'の両方が評価されます(場合...)' '(..あれば)第一およびsecond'を入れ子に置きたいと思うことがあります。 'return'のようなものはありません。 – ymonad

+1

@ymonadが何を言ったかを明確にするために、 'return'のようなものがありますが、これは暗黙的であり、規則の統一されたセットに従います。これは、Lispを非常に強力にするものですが、初心者のためにも混乱させます。機能的思考への最も簡単な移行は、パイプラインの観点から考えることです。あなたはリストの中で最も小さい数字を望んでいます。最初に、リストをソートすることです。今、リストの最初の要素が最小ですので、最初の要素を取得します。 '(first(sort nums))' Clojureは内部を評価し、ソートの戻り値が最初に渡される – Gary

答えて

0

あなたの2つのifは同じレベルにあります。したがって、両方が後で実行されます。あなたは二ifが最初if

(defn find-min[nums] 
    (loop [smallest 1000000 i 0] 
     (if (= (count nums) i) 
     smallest 
     (if (< (nums i) smallest) 
      (recur (nums i) (inc i)) 
      (recur smallest (inc i)))))) 
関連する問題