我经常发现自己需要的一种扩展reduce
的,每当我必须在每次处理一个项目(如减少)的,积累一些样的结果(如降低),但这样做的过程中基于最序列的前一项(与减少不同)。Clojure的:减少三个参数
例如(傻之一),添加1到累加器如果当前项和在前一个都是偶数和减去一个的他们是奇数。这只是一个愚蠢的例子,但我经常遇到这种问题。我通常将矢量作为累加器,以便第一项是真正的聚合,第二项是前一项。这不是非常优雅,当然冗长。
是否有一个核心功能在这些情况下帮助?处理这种问题的最习惯的方式是什么?由于
我经常发现自己需要的一种扩展reduce
的,每当我必须在每次处理一个项目(如减少)的,积累一些样的结果(如降低),但这样做的过程中基于最序列的前一项(与减少不同)。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))
“国家” 是Clojure中只有一个'partition'了。 – ponzao 2012-07-20 18:07:01
对于这个特定的问题,我建议kotarak的解决方案,使用分区来跟踪先前元素。但在一般情况下,你需要在除了你减少的最终“答案”来管理一些状态,你可以简单地减小了一对,或地图或什么的,并在年底走出累加器值。例如:
(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 – blueiur 2012-07-20 13:03:35