Clojure:reduce有三个参数

Clojure:reduce有三个参数,clojure,Clojure,我经常发现自己需要一种扩展的reduce,每当我必须在某个时间处理一个项目(如reduce),积累某种结果(如reduce),但根据序列的前一个项目进行处理(不像reduce) 例如(愚蠢的一个),如果当前项和前一项都是偶数,则在累加器中加1,然后减去其中一项是奇数。这只是一个愚蠢的案例,但我经常遇到这种问题。我通常将一个向量作为累加器,这样第一个项是实聚合,第二个项是前一个项。这不是很优雅,当然也不冗长 在这些情况下,是否有核心职能部门提供帮助?处理这种问题最惯用的方法是什么?感谢营救人员分区

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

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


在这些情况下,是否有核心职能部门提供帮助?处理这种问题最惯用的方法是什么?感谢营救人员

分区

(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))

对于这个特殊的问题,我推荐kotarak的解决方案,使用分区来跟踪前面的元素。但在一般情况下,除了reduce的最终“答案”之外,您还需要管理一些状态,您可以简单地对一对、一个map或其他任何对象进行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))))

请写这样的例子。输入:xxx输出:yyy“State”在Clojure中只有一个
分区。