当前位置: 首页 > 知识库问答 >
问题:

clojure-使用loop和recur并使用惰性序列

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

如果我像下面那样使用循环重复,列表会被急切地评估吗?

(loop [perms (permutations chain)]
       (if (empty? perms)
         (prn "finised")
         (recur (rest perms))))

如果需要计算它,我可以使用loop..recur来对置换函数返回的内容进行懒洋洋的循环吗?

共有1个答案

柯立果
2023-03-14

loop-recur代码会懒洋洋地计算列表。

你可以自己试试。让我们通过添加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时,我们还要使用we are looping over with(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"
 类似资料:
  • 问题内容: hibernate中的property标签的lazy属性允许按照以下链接延迟加载属性:http : //docs.jboss.org/hibernate/orm/3.3/reference/en-US/html/mapping.html#mapping- declaration -属性 lazy(可选-默认为false):指定在首次访问实例变量时应延迟获取此属性。它需要构建时字节码检测

  • 我们目前有几个@OneToOne关系,由于已知的惰性加载的限制,它们总是会急切地从反方向获取。 为了启用逆关系的延迟加载,我正在尝试启用构建时字节码检测。 到目前为止我所做的... 这些关系现在不再急切地加载...但是它们也不会延迟加载,它们只是静默地返回null。 我尝试从实体中删除接口和字段,因为我不确定是否需要这样做,在此之后,我在启动时不再获得消息,并且默认情况下返回到急切加载。 我是不是

  • 这是一个相当做作的例子。另外,我知道flatten和concat将给出嵌套级别不同的序列。 我试图弄清楚为什么flatten似乎能打破这种懒惰,尽管我对Clojure.core代码的理解有限,但我认为并非如此。

  • 我有一个使用服务器的小型WebSocket应用程序,我对自己感觉很好。现在我想添加不同的“房间”(列表应该是动态的)到我的应用程序,但我很难找到任何文档或示例项目。我并不害怕旋转我自己的解决方案,但依靠别人的经验是很好的。有人知道类似实现的例子吗? 2)我可以在每次打开新房间时建立一个新的套接字endpoint,并将新的URL发送回前端(或者如果房间已经打开了,则发送现有的URL),然后丢弃旧的套

  • 问题内容: 到目前为止,这是我的project.clj文件: 和我的core.clj文件: 显示Hello World消息就好了。所以下次我尝试并获得 到目前为止,一切似乎进展顺利,所以我尝试了,然后我收到了 我在这里怎么做错了? 问题答案: 您需要向名称空间添加声明:

  • 我正在尝试使用gradle/Clojuresque来构建clojure代码,运行它,并获得uberjar。我使用来自http://dev.clojure.org/display/doc/Getting从Gradle开始,https://bitbucket.org/kotarak/clojuresque/wiki/Getting开始了,但“找不到我们”。bpsm:ednjava:0.4。Clojur