Clojure - 使用循环递归的斐波那契 - 无限循环

Clojure - Fibonacci using loop recur - comes to infinite loop

我正在尝试使用循环递归构造来获取斐波那契数列:

(defn fibo-looprecur [x]
  (loop [current 0
         next 1
         result x]
       (if (= x 0) current (recur next (+' current next) (dec result))))
)

当我 运行 它时,它可以使用 0,但是当我将 1 放入 fibo-looprecur 时,它会进入无限循环。是什么导致了这种行为?

Clojure 使用值而不是引用类型;换句话说,x 和 result 不指向相同的值,而是不同的绑定。当您递减结果时,它对 x 没有影响,因此您永远不会遇到 x = 0 的基本情况。

如果您更改条件以检查结果而不是 x,您将获得预期的结果。

(defn fibo-looprecur [x]
  (loop [current 0
         next 1
         result x]
    (if (= result 0) current (recur next (+' current next) (dec result)))))

(map fibo-looprecur (range 10))
=> (0 1 1 2 3 5 8 13 21 34)