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

如何在Clojure中用惰性调用实现直观的斐波那契无限序列?

符合直观定义的惰性斐波那契序列实现

当然可以!我们可以用lazy-seq配合递归,直接对应斐波那契的核心定义fₓ = fₓ₋₁ + fₓ₋₂,完全不用map,同时保证惰性求值:

简洁直观版

(def fib
  (letfn [(fib-pair [a b]
            (lazy-seq
              (cons a (fib-pair b (+ a b)))))]
    (fib-pair 0 1)))

逻辑解释

  • 定义辅助函数fib-pair,接收当前序列的前两个数a和b
  • 每次先返回a作为序列的当前元素,然后递归调用fib-pair:把b作为下一次的第一个数,(+ a b)作为下一次的第二个数
  • 整个过程用lazy-seq包裹,确保序列是惰性的——只有在需要取元素时才会生成新值,不会无限循环或一次性生成所有元素

这个实现完全贴合数学定义:

  • 初始调用(fib-pair 0 1),先返回0
  • 递归调用(fib-pair 1 (+ 0 1)),返回1
  • 再递归调用(fib-pair 1 (+ 1 1)),返回1
  • 接着(fib-pair 2 (+ 1 2)),返回2,以此类推

更贴近初始值写法的版本

如果你想更明确地写出初始的0和1,也可以这样写:

(def fib
  (lazy-seq
    (cons 0
          (lazy-seq
            (cons 1
                  (letfn [(next-fib [a b]
                            (lazy-seq
                              (cons (+ a b)
                                    (next-fib b (+ a b)))))]
                    (next-fib 0 1)))))))

这个版本把初始的0和1直接写在序列开头,然后通过next-fib函数从这两个数开始生成后续元素,逻辑同样直观,完全符合你想要的“基于前两个数相加”的定义。

这两种实现都避开了你提到的循环、计数、多态,也没有用map,同时解决了之前尝试中缺乏惰性求值的问题。

内容的提问来源于stack exchange,提问作者jinTgreater

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 22:43:20