【问题标题】:Process a changing list using a higher-order function in Clojure使用 Clojure 中的高阶函数处理更改列表
【发布时间】:2020-12-27 00:58:57
【问题描述】:

有没有办法在 Clojure 中使用高阶函数来处理变化的列表,而 使用显式递归?例如,考虑以下问题(我为了说明我的想法而编造的):

问题:给定一个未知顺序的唯一整数列表。写一个 生成如下输出列表:

  1. 对于任何偶数整数,在输出列表中保持相同的相对位置。
  2. 对于任何奇数,乘以十,然后将新数放在新的 位置:在原始列表的后面。

例如,从原始向量 [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 并启动该过程,而不用担心 looprecur

所以我的问题是:有没有办法使用高阶函数来处理在其操作过程中发生变化的输入(在本例中为v)? p>

(更多上下文的旁注:这个问题的灵感来自Advent of Code 2020, Question 7, first part。在那里,接近它的自然方法是使用递归。我做here(在find-all-containers函数中;这是相同的其他人接近它的方式,例如,find-outer-bags 函数中的here,或sub-contains? 函数中的here。)

【问题讨论】:

    标签: clojure


    【解决方案1】:

    没有递归比使用递归要容易得多!由于您只关心偶数相对于其他偶数的顺序,同样关心赔率,您可以先将列表一分为二。然后,将正确的函数映射到每个函数上,然后简单地连接结果。

    (defn process [xs]
      (let [evens (filter even? xs)
            odds (filter odd? xs)]
        (concat evens (map #(* 10 %) odds))))
    

    关于代码问题的出现,我建议使用比列表或向量更好的数据结构。地图是表示正在发生的事情的更好方式,因为您可以通过名称轻松查找每个子包的属性。如果您有从袋子颜色到内容的映射,您可以编写一个简单的(递归)函数,询问:“颜色a 是否包含颜色b?”对于叶节点,答案是否定的,对于等于目标颜色的节点,答案是肯定的,对于分支,您可以递归内容。

    【讨论】:

    • 我非常喜欢您对我的样本的解决方案;但我不确定它是否解决了我要问的一般问题。一般来说,我问您是否通常会解决诸如(reduce f xs) 之类的问题,但xs 需要在您申请f 时进行更改——有没有办法解决这个问题?还是您的意思是,这取决于人们对个别问题的看法转变?
    • 是的,换个角度想问题,或者问一个更具体的问题。 “减少列表,但允许更改列表”基本上与“实现以列表为输入的函数”一样广泛。该任务没有通用的解决方案。
    • 您可以通过避免使用“更改”一词来减少问题陈述的混乱程度。在 Clojure 中没有任何变化。列表是不可变的。你给 map 或 reduce 的 f 是一个纯函数,它可以从一两个旧事物中产生一个新事物。但是,f 可以产生的新事物的性质是没有限制的!例如考虑(reduce + ...)(reduce str ...)(reduce into ...)产生的不同形状的东西。
    猜你喜欢
    • 2011-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多