Я обновил код ниже с noisesmith комментариями (для формата я не знаю, как это должно быть, кроме ...Clojure Бесконечный цикл Кошмар
Идея в том, что данный вектор [2 8 4 0], что оно в конечном итоге вернет [8 8 8 n], где n - это сумма рекурсии, которую требуется для достижения этого результата. В том случае, когда первые 3 входа являются четными. Первые 3 входа могут быть любым четным натуральным числом.
Позвольте мне предоставить пример:
(adjustedCandyAmounts [12 4 24 1]) [18 8 18 2] So know I iterate (recur... i guess) (adjustedCandyAmounts [18 8 18 3]) [18 14 18 4] recur... (adjustedCandyAmounts [18 14 18 3]) [18 16 18 4] Finally we reach our condition... (adjustedCandyAmounts [18 16 18 4]) [18 18 18 5] At this point the if statement should kick in.. So techniquely i just want to see a different paramater (vector) to adjustedCandyAmounts until the condition is met.
В настоящее время не обновляется с последним вектором, который представляет ток?
Если я использую Repl называть (adjustedCandyAmounts [4 2 4 0]) adjustedCandyAmounts Возвраты: [4 4 4 2]
Я ожидаю, что myLoopFunc (функция) с вектором называется текущим массивом будет «обновляться» с помощью «нового» (я знаю, что clojure не делает новый вектор ...) вектор получил и снова оценил условие. Тогда почему, если я попробую
(myLoopFunc [4 2 4 0]), он переходит в бесконечность и дальше.
(
defn calcAdjusted [[candyOwned adjacentCandy]]
(let [TotalCandy (+
(quot candyOwned 2) ; i had to give half of my candies to someone else
(quot adjacentCandy 2); i receive half of someone elses candy
)]
(if (odd? TotalCandy)
(+ TotalCandy 1);"Yes is an odd"
TotalCandy ;"is not an odd number"
)
)
)
(defn adjustedCandyAmounts [[r s t u]]
(let
[
rUpdated (calcAdjusted [r t]); r receives half of what t owns
sUpdated (calcAdjusted [s r]); s receives half of what r owns
tUpdated (calcAdjusted [t r]); t receives half of what s owns
counterIncremented (inc u)
]
; (println rUpdated)
(vector rUpdated sUpdated tUpdated counterIncremented)
)
)
(defn myLoopFunc [[r s t u]]
(
let [candyInitial [r s t u]]
(
loop [ current candyInitial]
(
if (= (nth current 0) (nth current 1) (nth current 2))
[current]
(recur (adjustedCandyAmounts current)) ;
)
)
)
)
Относительно комментария, который у вас есть на 'recur' - о чем вы говорите? В коде нет ничего, что занимает больше одного аргумента. Вы недопонимаете синтаксис «loop»? – noisesmith
Это была предыдущая версия кода. Я удалил комментарий для него. Теперь есть пример того, как adjustCandyAmounts соответствует условиям, но все же я получаю бесконечные циклы. Это должна быть структура данных. – hidden
([текущий]) должен быть [текущий] - дополнительные парсеры вызовут исключение. – noisesmith