【问题标题】:Clojure: reduce with three parametersClojure:使用三个参数减少
【发布时间】:2012-07-20 12:54:18
【问题描述】:

每当我必须一次处理一个项目(如reduce),累积某种结果(如reduce)时,我经常发现自己需要一种扩展的reduce,但要根据前面的项目进行处理序列(不像reduce)。

例如(一个愚蠢的),如果当前项目和前一个项目都是偶数,则在累加器中加 1,并减去其中一个是奇数。这只是一个愚蠢的案例,但我经常遇到这种问题。我一般做一个向量作为累加器,这样第一项是真正的聚合,第二项是前一项。这不是很优雅,当然也很冗长。

在这些情况下是否有核心功能可以提供帮助?处理此类问题最惯用的方法是什么?谢谢

【问题讨论】:

  • 请写出这样的例子。输入:xxx 输出:yyy

标签: clojure


【解决方案1】:

partition 来救援。

(reduce (fn [i [a b]]
          (cond
            (and (even? a) (even? b)) (inc i)
            (and (odd? a) (odd? b))   (dec i)
            :else i))
        0 (partition 2 1 input))

或者更简洁一点:

(reduce (fn [i pair]
          (condp every? pair
            even? (inc i)
            odd?  (dec i)
            i))
        0 (partition 2 1 input))

【讨论】:

  • "State" 在 Clojure 中只有一个 partition
【解决方案2】:

对于这个特殊的问题,我推荐 kotarak 的解决方案,使用分区来跟踪以前的元素。但是在一般情况下,除了reduce的最终“答案”之外,您还需要管理一些状态,您可以简单地通过一对或映射或其他方式进行reduce,最后得到累加器值。例如:

(defn parity [coll]
  (first (reduce (fn [[acc prev] x]
                   [(cond (and (even? prev) (even? x)) (inc acc)
                          (and (odd? prev) (odd? x)) (dec acc)
                          :else acc)
                    x])
                 [0 (first coll)], (rest coll))))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-10
    • 2018-10-29
    • 1970-01-01
    • 2020-03-25
    • 1970-01-01
    • 2016-03-26
    • 1970-01-01
    相关资源
    最近更新 更多