You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:50:24