Clojure 中的尾调用消除?

发布于 2024-08-20 02:45:26 字数 268 浏览 4 评论 0原文

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

Can somebody rewrite this (plt) Scheme code into 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)))

In such a way as to not collapse the procedures f, g, and h together and to allow the code to run indefinitely without crashing?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

故事↓在人 2024-08-27 02:45:26

使用蹦床:

(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 个小时,并且内存使用量持平。

Use a trampoline:

(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))

Kick it off with:

(trampoline f 0)

I've had this code running on my pc in the background for about 5 hours now and the memory usage is flat.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文