2014-09-07 3 views
0

Я обновил код ниже с 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)) ; 

     ) 
    ) 

) 
) 
+0

Относительно комментария, который у вас есть на 'recur' - о чем вы говорите? В коде нет ничего, что занимает больше одного аргумента. Вы недопонимаете синтаксис «loop»? – noisesmith

+0

Это была предыдущая версия кода. Я удалил комментарий для него. Теперь есть пример того, как adjustCandyAmounts соответствует условиям, но все же я получаю бесконечные циклы. Это должна быть структура данных. – hidden

+0

([текущий]) должен быть [текущий] - дополнительные парсеры вызовут исключение. – noisesmith

ответ

2

Ваше условие прекращения нечетное. (= (nth current 0) (nth current 1) (nth current 2) 2) означает, что вы тестируете равен ли первые три элемента current всех 2.

В myLoopFunc вы перебор на adjustedCandyAmounts до получения на выходе [2 2 2 n] (вы не тестируете четвертое значение). Если в качестве аргумента вызывается adjustedCandyAmounts с [4 4 4 n], он вернет [4 4 4 n+1]. Этот код не может использовать код для завершения вашего условия завершения.

Общая идея в рекурсии состоит в том, что должен быть некоторый аргумент, который гарантированно приближается к конечному условию. Например, у вас может быть число, которое уменьшается в каждом цикле, и вы останавливаетесь, когда оно достигает 0, или у вас может быть последовательность, которая становится короче и останавливается, когда она пуста. Этот код работает неопределенно, потому что нет способа достичь условия завершения.

Наконец, некоторые моменты, о стиле:

Пожалуйста, используйте стандартный PAREN размещение, комментарий, размещение пробелов и отступов. Теперь форматирование трудно читать.

В контексте (into [] (flatten (vector a b c d))) является неэффективным и трудно читаемым способом написания [a b c d].

(conj [] current) всегда лучше писать как [current].

+0

условие if, безусловно, неправильное i c, что сейчас. Я также сделаю корректировку для вектора. – hidden

+0

Is (nth current 0) (nth current 1) (nth current 2) обновляет значения на каждую итерацию или остается постоянным? Мне нужно, чтобы он менялся за каждую итерацию. Также мне нужно удалить 2 из условия if. – hidden

+0

Я получил правильный ответ спасибо! – hidden

Смежные вопросы