Clojure中使用loop-recur实现斐波那契出现无限循环问题排查
问题:Loop-recur实现斐波那契数列时传入1触发无限循环
我尝试用Clojure的loop-recur结构实现斐波那契数列,代码如下:
(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会进入无限循环,请问这是为什么?
原因分析
咱们来一步步拆解这个问题:
终止条件的逻辑错误
你写的终止条件是(= x 0),但这里的x是函数的入参,从调用开始就固定不变了!当你传入1时,x始终是1,这个条件永远不会成立,recur就会一直重复执行,直接导致无限循环。应该依赖循环变量判断终止时机
你在循环里特意定义了result变量用来记录剩余迭代次数,所以正确的终止条件应该检查result是否为0,而不是原始的入参x。修正后的代码示例
把条件改成(= result 0)就能解决问题:(defn fibo-looprecur [x] (loop [current 0 next 1 result x] (if (= result 0) current (recur next (+' current next) (dec result)))))测试验证:
(fibo-looprecur 0)→ 0(符合预期)(fibo-looprecur 1)→ 1(符合预期)(fibo-looprecur 5)→ 5(符合预期)
简单来说,你混淆了函数的固定入参和循环内部的可变状态变量,导致终止条件永远无法触发,进而引发了无限循环。
内容的提问来源于stack exchange,提问作者Boba_Fett
相关产品推荐
相关产品推荐

