По какой-то причине у меня возникают проблемы с хорошим выбором для перезаписи этой функции, поэтому она использует постоянное пространство стека. Большинство онлайн-дискуссий об обмане рекурсии деревьев используют функцию Фибоначчи и используют свойства этой конкретной проблемы. Есть ли у кого-нибудь идеи для этого «реального мира» (ну, более реального мира, чем серия Фибоначчи), использование рекурсии?Каков хороший способ переписать эту функцию без хвоста?
Clojure - интересный случай, поскольку он не имеет оптимизации хвостового вызова, а только рекурсию хвоста через специальную форму «recur». Это также сильно препятствует использованию изменчивого состояния. У этого есть много ленивых конструкций, включая tree-seq, но я не могу видеть, как они могут помочь мне в этом случае. Может ли кто-нибудь поделиться некоторыми методами, которые они выбрали из C, Scheme, Haskell или других языков программирования?
(defn flatten [x]
(let [type (:type x)]
(cond (or (= type :NIL) (= type :TEXT))
x
(= type :CONCAT)
(doc-concat (flatten (:doc1 x))
(flatten (:doc2 x)))
(= type :NEST)
(doc-nest (:level x)
(flatten (:doc x)))
(= type :LINE)
(doc-text " ")
(= type :UNION)
(recur (:doc1 x)))))
редактировать: По запросу в комментариях ...
пересчитаны в общих чертах и с использованием схемы - как я переписать следующий шаблон рекурсии, чтобы он не потребляет пространство стека или требовать tail- оптимизация звонков без звонков?
(define (frob x)
(cond ((foo? x)
x)
((bar? x)
(macerate (f x) (frob (g x))))
((thud? x)
(frobnicate (frob (g x))
(frob (h x))))))
Я выбрал раздражающих имена, чтобы ехать домой точки, что я ищу ответы, которые не зависят от алгебраических свойств х, вымачивать, frobnicate, F, G, или ч. Я просто хочу переписать рекурсию.
UPDATE:
Rich Хики любезно добавил явную trampoline function в Clojure.
я бы сказал, «C++», но это было бы бесполезно ;-) – 2008-11-24 21:21:58
было бы легче помочь, если вы объясните, что функция делает делать. возможно, также используя более распространенный диалект LISP, я сам люблю использовать Схему дома, но на самом деле мне не нравится внешний вид clojure. – Javier 2008-11-24 21:30:18
Я добавил версию схемы, но я сомневаюсь, что она будет очень полезной для вас. :) – 2008-11-24 21:43:45