gpt4 book ai didi

clojure - 在(reduce f val coll)中,val是累加器吗?

转载 作者:行者123 更新时间:2023-12-02 06:30:57 25 4
gpt4 key购买 nike

当您调用reduce并向其传递一个函数和两个参数时,第一个参数可以被视为累加器吗?

总是一个累加器吗?

有时是一个累加器吗?

我正在阅读一篇关于使用 Clojure 解析大文件的博客文章,并发现了这一行:

(reduce line-func line-acc (line-seq rdr))

博客条目链接:

http://lethain.com/reading-file-in-clojure/

一个简单的:(reduce + [1 2 3])怎么样?是否涉及累加器?

我认为我的问题归结为:“累加器到底是什么?”

但我仍然想了解累加器和reduce函数之间的关系。因此,非常欢迎对这些具体(相关)问题的任何回答!

最佳答案

在(reduce f val coll)中,val是累加器吗?

否。它是函数 f 的一个参数。这意味着 f 应用于 val 和 coll 中的第一个元素。

例如:

(reduce + 1 [2 3 4])        ;; 10
(reduce + (cons 1 [2 3 4])) ;; 10

简单的怎么样:(reduce + [1 2 3])?是否涉及累加器?

不是。它是函数f的一系列应用;像这样:

(reduce f [1 2 3 4]) ; ==> (f (f (f 1 2) 3) 4)
(reduce f 1 [2 3 4]) ; ==> (f (f (f 1 2) 3) 4)

请注意,在这两种情况下,对 f 最内部的调用都采用参数 1 和 2 ?第一种情况,1和2分别是coll的第一个和第二个元素;在第二种情况下,1 是唯一值,2 是 coll 的第一个元素。

累加器到底是什么?

累加器是一个保存计算中间结果的变量。就像这段 Java 代码片段一样:

int sum = 0;
for (int i = 0; i < 10; i++) {
sum += i;
}
return sum;

这里,变量 sum 的值随着循环的进行而改变。在 Clojure 中,变量是不可变的,因此您不会看到这种习惯用法。相反,累加器更常见(但并非总是)是递归函数的参数。

例如,这里有一个函数,它通过将列表中的第一个条目“累加”到累加器的前面来反转列表。在这种情况下,变量不会更改,而是传递给函数的另一个调用。

(defn reverse [[f & r] acc]
(if (nil? f)
acc
(recur r (conj acc f))))

(reverse [1 2 3] ()) ;; [3 2 1]

关于clojure - 在(reduce f val coll)中,val是累加器吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11348380/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com