gpt4 book ai didi

recursion - 如何为递归函数的每次迭代收集多个项目

转载 作者:太空宇宙 更新时间:2023-11-03 18:52:01 28 4
gpt4 key购买 nike

我想为递归函数的每次调用创建多个项目,并将所有内容收集在一个列表中。也就是说,我想做这样的事情:

(defn myfunc [x]
(loop [x x retur '()]
(when condition1
(let [templist '()]
(if condition2 (def templist (conj templist {:somekey someval})))
(if condition3 (def templist (conj templist {:somekey someval})))
(recur (+ x 1) (concat retur templist))))))

问题是在 Clojure 中我不能重新绑定(bind) let。我想避免使用全局变量。

最佳答案

核心中的一些函数使用这种通过 let 链接相同符号的模式来有条件地建立一个值。我不得不将 contition1 更改为一个不会永远循环的示例,并将 when 更改为 if 以便它可以在循环结束时返回一个值。

(defn myfunc [x someval1 someval2 condition1 condition2 condition3]
(loop [x x retur '()]
(if (condition1 x)
(let [templist '()
templist (if condition2 (conj templist {:somekey1 someval1}) templist)
templist (if condition3 (conj templist {:somekey2 someval2}) templist)]
(recur (+ x 1) (concat retur templist)))
retur)))

然后可以对其进行测试:

 user> (myfunc 0 1 2 #(< % 5) true true)
({:somekey2 2} {:somekey1 1} {:somekey2 2} {:somekey1 1} {:somekey2 2}
{:somekey1 1} {:somekey2 2} {:somekey1 1} {:somekey2 2} {:somekey1 1})

user> (myfunc 0 1 2 #(< % 5) true false)
({:somekey1 1} {:somekey1 1} {:somekey1 1} {:somekey1 1} {:somekey1 1})

let 中的想法是让每个阶段在条件为真时更改值,或者在条件为假时将其原封不动地返回。这种模式为函数式代码提供了一种命令式的外观,并有助于阐明值的构造方式,尽管在使用它来将命令式逻辑“转换”为函数式程序时也可能走得太远。

关于recursion - 如何为递归函数的每次迭代收集多个项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14616568/

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