我正在尝试实现程序中的一个功能。我有list = [a b c]作为func3中的参数。我想测试这些项目的相等性。如果它们不相等,我将使用func2的另一个列表返回再次调用它。 这是我需要做的。我希望Conj执行此操作[list list1 list2 list3],直到func3具有相同的项目。在我的函数中,我希望conj在条件为false时将空向量r []合并到其他列表。当条件为真时,我现在得到的是最终列表返回。在得到真实之前,假设条件必须为假(项目不相等)。有人可以帮助我在假情况下使用魔法。谢谢。
;input [1 2 3]
;output [[1 2 3][1 3 4] [3 4 5] ]// numbers for demo only
(defn func3 [list]
(loop [v (vec list) r []]
(if(= (v 0) (v 1) (v 2))
(conj r v)
(let[result (func2 v)]
;i want to merge result to r until the condition is true
(conj r result)
(func3 result)))))
答案 0 :(得分:1)
我知道你有一个包含三个元素的列表作为初始输入,想要比较它们是否相等。如果它们匹配,您希望将列表附加到以后返回的累加器 - 如果它们不匹配,您希望使用惯用的func2
函数转换列表并再次尝试该过程。
编辑:既然你已经评论了你的函数应该如何工作,那么这里有一个实现:
(defn func3
"Determines whether items in coll are equal. If not, transforms coll with func2 and
repeats the test until a coll with equal elements could be found.
Returns a vector of all tried versions."
[coll]
(loop [acc []
coll coll]
(if (apply = coll)
(conj acc coll)
(recur (conj acc coll)
(func2 coll)))))
这是一个懒惰的实现:
(defn func3
[coll]
(-> (->> coll
(iterate func2)
(split-with (partial apply =)))
(as-> [dropped [r]]
(concat dropped [r])))
答案 1 :(得分:1)
Conj从不更改其输入,它会根据输入创建新输出。在第二个条件中,你没有对conj的输出做任何事情,所以它的结果从未使用过。
(defn func3 [list]
(loop [[v & vs] (vec list) r []]
(if (= (v 0) (v 1) (v 2))
(conj r v)
(let [result (func2 v)
r (conj r result)]
(recur vs r)))))