Устранение последнего вызова в Clojure?

Кто-то может переписать этот (plt) код Схемы в Clojure?

(define (f n)
   (printf "(f ~a)~n" n)
   (g n))

(define (g n)
   (printf "(g ~a)~n" n)
   (h n))

(define (h n)
   (printf "(h ~a)~n" n)
   (f (+ n 1)))

Таким способом как относительно не сворачивают процедуры f, g и h вместе и позволить коду работать неограниченно долго без катастрофического отказа?

17
задан tkf 2 February 2010 в 04:34
поделиться

1 ответ

Используйте батут:

(declare f)

(defn h [n]
   (println "(h " n ")")
   #(f (+ n 1)))

(defn g [n]
   (println "(g " n ")")
   #(h n))

(defn f [n]
   (println "(f " n ")")
   #(g n))

Начните с:

(trampoline f 0)

Этот код работает на моем компьютере в фоновом режиме уже около 5 часов, а использование памяти невелико.

30
ответ дан 30 November 2019 в 12:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: