У меня была идея для общей функции для рекуррентных отношений в Clojure:Как определить общую функцию повторения в Clojure
(defn recurrence [f inits]
(let [answer (lazy-seq (recurrence f inits))
windows (partition (count inits) 1 answer)]
(concat inits (lazy-seq (map f windows)))))
Тогда, например, мы можем определить последовательность Фибоначчи как
(def fibs (recurrence (partial apply +) [0 1N]))
Это работает достаточно хорошо для небольших чисел:
(take 10 fibs)
;(0 1N 1N 2N 3N 5N 8N 13N 21N 34N)
Но удары стеком, если просили реализовать длинная последовательность:
(first (drop 10000 fibs))
;StackOverflowError ...
Есть ли способ преодолеть это?
мысль: мы могли бы отменить использование CONCAT, и сделать функцию много более эффективный, если бы мы использовали deque для состояния (таким образом, позволяя эффективно отбрасывать самый старый элемент в состоянии и эффективно добавлять самые новые) – noisesmith
Благодарим вас за объяснение причины сбоя. – Thumbnail
Я пробовал ваше предложение об использовании очереди - я не думаю, что это не требуется. См. [Здесь] (http://stackoverflow.com/a/43126749/1562315). – Thumbnail