Clojure中的Tribonaci函数

Clojure中的Tribonaci函数,clojure,Clojure,是否有一种不同的、更清洁的方法来生成Tribonaci (defn tribonacci [x](last (reduce (fn [[a b c] n] (conj [b c] (+ a b c))) [0 0 1] (range (- x 3))))) 我会这样写: (defn tribonacci [a b c] (lazy-seq (cons a (tribonacci b c (+' a b c))))) 如果要获取第n个Tribonaci编号

是否有一种不同的、更清洁的方法来生成Tribonaci

(defn tribonacci [x](last (reduce
      (fn  [[a b c] n]
          (conj [b c] (+ a b c))) [0 0 1] (range (- x 3)))))

我会这样写:

(defn tribonacci [a b c]
  (lazy-seq (cons a (tribonacci b c (+' a b c)))))

如果要获取第n个Tribonaci编号,只需使用,例如,
(Tribonaci 0 0 1)
,然后调用
n

您可以创建这些编号的延迟序列,并从中获取所需的元素:

user> (def t (lazy-cat [1 1 2] (map +' t (rest t) (nthrest t 2))))
#'user/t
user> (take 20 t)
(1 1 2 4 7 13 24 44 81 149 274 504 927 1705 3136 5768 10609 19513 35890 66012)

[1 1 2]
替换为
[0 1 1]
,如果您需要从
0

开始,这是个坏主意,一旦您意识到
t
的某些元素,这些元素将不会被垃圾收集,因为var保留在序列的头部。是的,我知道,只是想展示惰性序列的魔力。(好吧,既然问题是“还有别的办法吗”,我猜这是可能的答案