Clojure 一旦达到所需的累加,如何停止reduce函数处理列表?
在程序世界中,如果我必须找到满足测试的列表的第一项,我只会使用Clojure 一旦达到所需的累加,如何停止reduce函数处理列表?,clojure,functional-programming,Clojure,Functional Programming,在程序世界中,如果我必须找到满足测试的列表的第一项,我只会使用break或return 在Clojure中,当我使用reduce查找第一个值来处理列表时,如果我继续处理整个列表,会不会效率低下 例如:验证字典列表中的错误;每个字典都有一个名为count的键。现在,列表中这些计数字段的总和不应超过某个值。如何找到列表中金额超过限额的第一项 理想情况下,我会使用减少并保持一个运行总数;一旦总数超过限制,我想停在那里(我不知道怎么做) 此外,reduce的返回值每次都是到现在为止的总和,但我需要在最后
break
或return
在Clojure中,当我使用reduce
查找第一个值来处理列表时,如果我继续处理整个列表,会不会效率低下
例如:验证字典列表中的错误;每个字典都有一个名为count
的键。现在,列表中这些计数字段的总和不应超过某个值。如何找到列表中金额超过限额的第一项
理想情况下,我会使用减少并保持一个运行总数;一旦总数超过限制,我想停在那里(我不知道怎么做)
此外,reduce的返回值每次都是到现在为止的总和,但我需要在最后返回索引 您可以使用该功能终止还原:
(reduce (fn [sum x]
(if (> sum 10)
(reduced 10)
(+ sum x)))
0
[1 2 3 4 5 6 7 8 9 10])
我很想使用它,而不是找到断点。这比以前慢了很多,但是允许我们练习一些序列库
例如,给定
(def data [{:count 19}
{:count 93}
{:count 89}
{:count 91}
{:count 55}
{:count 22}
{:count 22}
{:count 22}
{:count 40}
{:count 89}])
然后
。。。返回累计<代码>:计数<代码>值的顺序
让我们假设限制为300
。然后
(let [acceptable (take-while
(partial >= 300)
(reductions + (map :count data)))]
acceptable)
; (19 112 201 292)
。。。返回满足极限条件的初始子序列。这告诉我们我们想知道的两件事:
- 它的
最后一个
元素是累计的:计数
- 它的长度(令人困惑的是,由函数返回)是第一个被拒绝元素的位置,从0开始计数
例如,可以使用长度将原始序列拆分为接受部分和拒绝部分:
(let [acceptable (take-while ...)]
(split-at (count acceptable) data))
; [({:count 19} {:count 93} {:count 89} {:count 91})
; ({:count 55} {:count 22} {:count 22} {:count 22} {:count 40} {:count 89})]
如果我们知道原始序列是一个向量,我们可以使用subvec
更快地提取其部分
(let [acceptable (take-while ...)
point (count acceptable)]
[(subvec data 0 point) (subvec data point)])
; [[{:count 19} {:count 93} {:count 89} {:count 91}]
; [{:count 55} {:count 22} {:count 22} {:count 22} {:count 40} {:count 89}]]
哦,哇!像这样的事情是存在的。但是我需要返回发生这种情况的位置,否则返回-1。但如果回报指数在下降,我怎么积算呢。我应该把这两个值都放在地图或列表中吗?并在每次reduce调用结束时返回两个值?是的,您可以更新累加器中的索引。类似于(fn[acc x](if(>(:sum acc)10)(reduced acc)(assoc acc:idx(inc(:idx acc)):sum(+(:sum acc)x)))。
(let [acceptable (take-while ...)
point (count acceptable)]
[(subvec data 0 point) (subvec data point)])
; [[{:count 19} {:count 93} {:count 89} {:count 91}]
; [{:count 55} {:count 22} {:count 22} {:count 22} {:count 40} {:count 89}]]