私はここで提起された問題を解決するためにClojureアルゴリズムに取り組んでいます:http ://spin.atomicobject.com/2011/05/31/use-clojure-to-move-drugs-a-programming-challenge/そして私はしゃっくりに遭遇しました。
私は再帰的アルゴリズムを使用して(おそらく最初は正しい選択ではありません)、値と重量の比率が最も高いものから最も低いものの順に並べられた「人形」構造体のベクトルを調べています。関連するコードは次のとおりです。
(defn get-carryable-dolls
[dolls carryable-dolls]
(def doll (first dolls)) ;initializing for use in multiple places
(def rest-dolls (rest dolls)) ;initializing for use in multiple places
(
if (will-fit? doll (get-weight-sum carryable-dolls))
( ;will fit
(
if
(= carryable-dolls {})
(def new-doll-set [doll]) ;First trip, get rid of empty set by initializing new
(def new-doll-set (flatten [doll carryable-dolls])) ;otherwise, flatten set into vector of structs
)
;tests to see if we have any more dolls to test, and if so, recurses. Otherwise, should pass the resultant vector
;up the stack. it appears to be the "else" potion of this if statement that is giving me problems.
(if (not= () rest-dolls) (get-carryable-dolls rest-dolls new-doll-set) (vec new-dolls))
)
( ;will not fit
;gets the rest of the dolls, and sends them on without modifying the vector of structs
;it appears to be the "else" potion of this if statement that is giving me problems.
(if (not= () rest-dolls) (get-carryable-dolls rest-dolls carryable-dolls) (vec carryable-dolls))
)
)
)
そのコードは正しく機能しています。returnable-dollsには、ソリューションとして返す人形構造体の目的のベクトルが含まれています。残念ながら、returnable-dollsベクトルを呼び出し位置に戻そうとすると、次のエラーが発生します。
CompilerException clojure.lang.ArityException: Wrong number of args (0) passed to: PersistentVector,compiling:(drugmover\tests.clj:83)
82-83行目:
(def empty-dolls {})
(def designated-dolls (get-carryable-dolls sorted-values empty-dolls))
コンパイラエラーの問題の原因が何であるかについて困惑しています。Clojureはスタックトレースよりも簡潔なエラーメッセージを好むようです(または、少なくともCloojのREPL機能はそうです)。それを修正します。誰か提案があれば、私はそれらに大いに感謝します!
前もって感謝します。
編集:
回答とコメントで提案された修正を使用してコードを変更し、進行中のフロー制御を説明するのに役立ついくつかのコメントを提供しました。うまくいけば、私の考えを説明することによって、誰かが私がどこで間違っているのかを私に教えてくれるでしょう。