Clojure中的尾调用优化?

17

能否有人将这段(plt)Scheme代码改写成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,并使代码无限运行而不崩溃?

1个回答

30

使用跳板函数:

(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个小时,内存使用量保持不变。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接