gpt4 book ai didi

clojure - 使用循环并以惰性序列递归

转载 作者:行者123 更新时间:2023-12-04 18:40:14 25 4
gpt4 key购买 nike

如果我从这样的函数返回一个惰性序列:

(letfn [(permutations [s]
(lazy-seq
(if (seq (rest s))
(apply concat (for [x s]
(map #(cons x %) (permutations (remove #{x} s)))))
[s])))])

如果我像下面这样使用循环 recur,是否会急切地评估列表?
(loop [perms (permutations chain)]
(if (empty? perms)
(prn "finised")
(recur (rest perms))))

如果它被急切地评估,我可以使用 loop..recur 来懒惰地循环从 permutations 返回的内容吗?功能?

最佳答案

该列表由您的循环重复代码懒惰地评估。

你可以自己试试。让我们做 permutations通过添加 println 每次返回值时打印一些内容称呼。

(defn permutations [s]
(lazy-seq
(if (seq (rest s))
(apply concat (for [x s]
(map #(cons x %) (permutations (remove #{x} s)))))
(do
(println "returning a value")
[s]))))

使用时 loop ,让我们也打印我们正在循环的值 (prn (first perms) .
(loop [perms (permutations [1 2 3])]
(if (empty? perms)
(prn "finised")
(do
(prn (first perms))
(recur (rest perms)))))

这是它打印的内容:
returning a value
(1 2 3)
returning a value
(1 3 2)
returning a value
(2 1 3)
returning a value
(2 3 1)
returning a value
(3 1 2)
returning a value
(3 2 1)
"finished"

如您所见,“返回值”和值行是交错的。可以使用 doall 强制对惰性序列进行评估.如果您循环遍历 (doall (permutations [1 2 3])) ,首先它打印所有“返回值”行,然后才打印值。

关于clojure - 使用循环并以惰性序列递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27884794/

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