Я работаю над алгоритмом Clojure для решения проблемы, поставленной здесь: http://spin.atomicobject.com/2011/05/31/use-clojure-to-move-drugs-a-programming-challenge/, и я столкнулся с икотой.Clojure возвращает значения из рекурсивного вызова
Я использую рекурсивный алгоритм (возможно, не правильный выбор для начала), чтобы пройти по вектору «кукольных» структур, упорядоченных по соотношению от максимальной к самой низкой величине к весу. Соответствующий код:
(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))
)
)
)
Этот код работает правильно; Возвращаемые куклы содержат желаемый вектор кукольных структур, возвращаемых в качестве решения. К сожалению, когда я пытаюсь вернуть вектор возвратной-куклы в позицию вызывающей, я получаю следующее сообщение об ошибке:
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, похоже, предпочитает короткие сообщения об ошибках по трассировке стека (или, по крайней мере, функциональность REPL в Clooj), я не понимаю, как это исправить. Если у кого-нибудь есть предложения, я бы очень признателен им!
Заранее спасибо.
EDIT:
Я изменил код с предложенными исправлениями теми, в ответах и комментариях, и представила несколько замечаний, чтобы проиллюстрировать управление потоком, что происходит. Надеюсь, что, иллюстрируя мое мышление, кто-то сможет дать мне представление о том, где я ошибаюсь.
Вы дождевания скобку во всем коде, как если бы они были фигурные скобки. –
Можете ли вы указать конкретный пример того, что я мог бы удалить круглые скобки и все равно получить тот же результат? Я очень, очень новичок в этом. – EricBoersma
Например: сразу после условия первого 'if' имеются две открывающиеся скобки; первый не нужен, второй правильный, потому что это открывающая скобка второго 'if'. –