Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure 一旦达到所需的累加,如何停止reduce函数处理列表?_Clojure_Functional Programming - Fatal编程技术网

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}]]