Clojure递归中的评估顺序

时间:2015-08-28 07:26:19

标签: clojure

SPOILER ALERT:此问题涉及4clojure.com问题。如果你是像我一样的Clojure新手,你可能想先自己尝试一下。

我成功地回答了这个问题(#68),但只是在犯了一个我仍不确定为什么是错的错误之后。

以下是问题:

(= __
  (loop [x 5
         result []]
    (if (> x 0)
      (recur (dec x) (conj result (+ 2 x)))
      result)))

我的初步答案是[6 5 4 3 2],而接受的答案是[7 6 5 4 3]。 我不完全理解它,因为(dec x) (conj result (+ 2 x))之前,并且它们都在循环中同样嵌套。我认为因为减量似乎发生在联合之前,结果向量将以递减的x加2开始。但它并没有那样发生。这显然是非常基本的东西,但也许有人可能会解释它是怎么回事? 谢谢。

1 个答案:

答案 0 :(得分:4)

clojure和immutable中的变量(大多数情况下,无论如何)。 var countries = [1, "DK", 2, "USA", 3, "Sweden"]; var languages = [2, "English", 1, "Danish", 3, "Swedish"]; var population = [3, 8000000, 1, 6000000, 2, 3000000000]; 实际上并未减少当前范围内的// In USA people speak English and there live 300000000 people // In DK people speak Danish and there live 6000000 people // In Sweden people speak Swedish and there live 8000000 people 。它返回 (dec x)的结果,然后将其用作重复的参数,您可以将其视为x“函数的另一个调用”。因此(dec x)在此范围内未发生变化。 loop使用具有相同旧值的相同变量x

相关问题