Clojure无限循环梦魇

时间:2014-09-07 23:20:52

标签: clojure

我已经用noisesmith评论更新了下面的代码(格式除外我不知道它应该是什么......

这个想法是给定一个向量[2 8 4 0]它最终将返回[8 8 8 n],其中n是获得该结果所需的递归量。前三个输入均为偶数。前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来打电话 (adjustCandyAmounts [4 2 4 0]) adjustedCandyAmounts返回:[4 4 4 2]

我的期望是带有一个名为current array的向量的myLoopF​​unc(函数)将使用“new”(我知道clojure不会执行新的向量...)向量“更新”,并再次评估该条件。那为什么我试试

(myLoopF​​unc [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)) ; 

        )
    )

 )
)

1 个答案:

答案 0 :(得分: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时你停止,或者你可以有一个变短的序列,当它是空的时候停止。此代码无限期运行,因为无法达到终止条件。

最后,关于风格的一些观点:

请使用标准填充位置,注释放置,空格和缩进。你现在的格式很难理解。

在上下文中,(into [] (flatten (vector a b c d)))只是一种低效且难以阅读的写作方式[a b c d]

(conj [] current)总是更好地写为[current]