我通过解决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))
结果发现我的解决方案更快(这在某种程度上是可以预料的,因为另一个用户依赖 last,其时间为 O(n))。然而,当我尝试计算第 1000 行时,只有在我的函数中才会出现堆栈溢出错误。我很难理解为什么会发生这种情况,因为我没有增加堆栈大小。我错过了什么?