我已经用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的向量的myLoopFunc(函数)将使用“new”(我知道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 :(得分: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]
。