我通过做rich4clojure仓库中的问题来学习Clojure。问题147要求创建一个函数,该函数接收初始行,并返回基于帕斯卡规则生成的后续行序列。例如,对于[3 1 2],下一个行是[3 4 3 2]。这是我的解决方案
(defn pascal
([row] (lazy-seq (cons row (__ row :next))))
([row _]
(lazy-seq
(let [next-row (map #(apply +' %) (partition 2 1 (concat '(0) row '(0))))]
(cons next-row (pascal next-row :next)))))))
我决定测试它并与别人的解决方案进行比较。例如,一个用户写了
(defn pascal [coll]
(lazy-seq
(cons coll
(pascal (let [middle (map #(apply +' %) (partition 2 1 coll))]
(concat [(first coll)] middle [(last coll)]))))))
通过评估来计时两个解决方案
time (nth (nth (pascal [1]) 400) 50))
结果显示我的更快(这是可以预料的,因为另一个用户依赖 on last,这是 O(n) 的)然而,当我去计算第1000行时,只有我的函数会抛出栈溢出错误。我努力想弄清楚为什么会发生这种情况,因为我不应该增加栈的大小。我遗漏了什么?