Clojure如何实现vector数字元素依次累加生成前缀和,现有map写法无效怎么解决
问题原因分析
你写的实现代码存在两个核心问题:
map遍历集合时,匿名函数内的%对应的是当前遍历到的单个数字元素(第一次是10、第二次是27,以此类推),你调用的next是序列操作函数,只能作用于集合类型,对数字调用会直接抛出类型错误。- 你的逻辑没有存储之前累加的结果,就算语法修正也无法计算出符合要求的前缀和序列。
正确实现方案
Clojure内置了reductions函数,它的作用是返回reduce执行过程中每一步的中间结果,刚好匹配前缀累加的需求,不需要手动写遍历逻辑:
(reductions + coll)
执行后输出结果就是你需要的(10 37 44 56)。
如果希望手动实现底层逻辑加深理解,可以用惰性序列实现:
(defn prefix-sum [coll] (letfn [(sum-seq [acc s] (lazy-seq (when-let [x (first s)] (let [new-acc (+ acc x)] (cons new-acc (sum-seq new-acc (rest s)))))))] (sum-seq 0 coll)))
调用(prefix-sum coll)也可以得到相同的输出结果。
内容的提问来源于stack exchange,提问作者Dimitrios Fkiaras
相关产品推荐
相关产品推荐

