gpt4 book ai didi

使用 lazy-seq 的 Clojure 尾递归

转载 作者:行者123 更新时间:2023-12-04 16:04:53 24 4
gpt4 key购买 nike

您能否更全面、更清晰地解释一下,lazy-seq 如何按照此文档页面使尾递归“安全”?

https://clojuredocs.org/clojure.core/lazy-seq

;; The following defines a lazy-seq of all positive numbers.  Note that 
;; the lazy-seq allows us to make a recursive call in a safe way because
;; the call does not happen immediately but instead creates a closure.

user=> (defn positive-numbers
([] (positive-numbers 1))
([n] (lazy-seq (cons n (positive-numbers (inc n))))))
#'user/positive-numbers

user=> (take 5 (positive-numbers))
(1 2 3 4 5)

最佳答案

如果您查看 lazy-seq 的实现,您会发现它确实返回了一个闭包(一个保留一段上下文的函数):

(list 'new 'clojure.lang.LazySeq (list* '^{:once true} fn* [] body))

所以 (cons n (positive-numbers (inc n)) 中对 positive-numbers 的调用不会立即求值,而是延迟到闭包被调用。

关于使用 lazy-seq 的 Clojure 尾递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49208253/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com