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

Loops Clojure-使用循环递归的斐波那契-到达无限循环,loops,clojure,infinite,Loops,Clojure,Infinite,我尝试使用循环递归构造得到斐波那契数: (defn fibo-looprecur [x] (loop [current 0 next 1 result x] (if (= x 0) current (recur next (+' current next) (dec result)))) ) 当我运行它时,它与0一起正常工作,但当我将1放入fibolooprecur时,它将进入无限循环。什么会导致这种行为?Clojure使用的是值而不是引用

我尝试使用循环递归构造得到斐波那契数:

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

当我运行它时,它与0一起正常工作,但当我将1放入fibolooprecur时,它将进入无限循环。什么会导致这种行为?

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)

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)

每次您重新回到循环中时,current、next和result都会采用新的值。更重要的是,如果调用x设置为1的函数,x将始终具有相同的原始值,它将始终为1,而不是0。因此,循环将永远不会退出。好的,但dec result不应该将x更改为0吗?不,它将递减结果。因此,检查bindings是否在每次返回循环时,current、next和result都具有新的值。更重要的是,如果调用x设置为1的函数,x将始终具有相同的原始值,它将始终为1,而不是0。因此,循环将永远不会退出。好的,但dec result不应该将x更改为0吗?不,它将递减结果。所以,请确实检查一下!现在我明白了,我试着比较绑定的错误部分。谢谢你的提示!的确现在我明白了,我试着比较绑定的错误部分。谢谢你的提示!