【问题标题】:Tail Call Elimination in Clojure?Clojure中的尾调用消除?
【发布时间】:2010-02-02 04:16:20
【问题描述】:

有人可以将这个 (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 一起折叠并允许代码无限期运行而不会崩溃的方式?

【问题讨论】:

    标签: clojure scheme tail-recursion tail-call-optimization


    【解决方案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 个小时,并且内存使用量持平。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-25
      • 1970-01-01
      • 1970-01-01
      • 2013-05-15
      • 1970-01-01
      相关资源
      最近更新 更多