reduce每当我必须按时处理项目(比如reduce)时,我经常发现自己需要一种扩展,积累某种结果(比如reduce),但是根据序列的前一项(不像reduce)进行处理.
例如(一个愚蠢的),如果当前项和前一项都是偶数,则向累加器加1,并减去其中一项奇数.这只是一个愚蠢的案例,但我经常遇到这种问题.我通常将一个向量作为累加器,因此第一项是真正的聚合,第二项是前一项.这不是很优雅,当然也很冗长.
在这些情况下是否有核心功能可以帮助?处理这类问题最常用的方法是什么?谢谢
kot*_*rak 18
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))
Run Code Online (Sandbox Code Playgroud)
或者更简洁一点:
(reduce (fn [i pair]
(condp every? pair
even? (inc i)
odd? (dec i)
i))
0 (partition 2 1 input))
Run Code Online (Sandbox Code Playgroud)
ama*_*loy 10
对于这个特殊问题,我推荐使用kotarak的解决方案,使用分区来跟踪前面的元素.但是在一般情况下,除了你的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))))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1087 次 |
| 最近记录: |