【发布时间】:2020-12-27 00:58:57
【问题描述】:
有没有办法在 Clojure 中使用高阶函数来处理变化的列表,而 不 使用显式递归?例如,考虑以下问题(我为了说明我的想法而编造的):
问题:给定一个未知顺序的唯一整数列表。写一个 生成如下输出列表:
- 对于任何偶数整数,在输出列表中保持相同的相对位置。
- 对于任何奇数,乘以十,然后将新数放在新的 位置:在原始列表的后面。
例如,从原始向量 [1 2 3 4 5],我们得到:[2 4 10 30 50]
我知道如何使用显式递归来解决这个问题。例如:
(defn process
[v]
(loop
[results []
remaining v]
(if (empty? remaining)
results
(if (even? (first remaining))
(recur (conj results (first remaining)) (rest remaining))
(recur results (conj (vec (rest remaining)) (* 10 (first remaining))))))))
这很好用。请注意,remaining 会随着函数的工作而变化。我也在这里做家务:将元素从remaining 改组到results。我想做的是使用一个为我做家务的高阶函数。例如,如果 remaining 没有随着函数的工作而改变,我会使用 reduce 并启动该过程,而不用担心 loop 或 recur。
所以我的问题是:有没有办法使用高阶函数来处理在其操作过程中发生变化的输入(在本例中为v)? p>
(更多上下文的旁注:这个问题的灵感来自Advent of Code 2020, Question 7, first part。在那里,接近它的自然方法是使用递归。我做here(在find-all-containers函数中;这是相同的其他人接近它的方式,例如,find-outer-bags 函数中的here,或sub-contains? 函数中的here。)
【问题讨论】:
标签: clojure