首页 > 教育学习 > 为什么 > 在函数式编程中,什么是累加器?

在函数式编程中,什么是累加器?
2012-01-19 18:16:28   来源:   点击:

    在函数式编程中,什么是累加器?指函数式编程中的累加器.

    2 个答案

    • 答案 1:

      因为纯函数式语言是没有状态的,因此在一些循环计算的时候不能向过程式和OO语言那样通过修改一个变量来达到计算的目的,比如对一个列表的数求和,python可以这样:

      sum = 0 for num in list: sum += num 而函数式语言是不能这样的,只能是使用递归,最简单的形式是(haskell表示): sum :: [Int] -> Int sum (x:xs) = x + sum xs sum [ ] = 0 其实,这里用haskell来做例子是不合适的,因为haskell是lazy evaluation,我们假设是strict evaluation的,(对不起,今天喝了点酒,lisp一下子也不出来了)。这其实是一个连加式,只有到了最后一项得到0后才能计算出结果。这是很耗内存的。这时候就可以使用累加器了,累加器就是将当前的计算结果放到参数里,也就是带着当前的状态了。 sum :: Int -> [Int] -> Int sum a (x:xs) = sum (a+x) xs sum a [ ] = a 这里的a就是累加器。 因为用的是haskell,这里的累加器不是一个整数,而是一个计算,只有到最后一步返回结果并且结果需要一定的计算的时候才会计算成一个整数,否则结果就是一个连加式的thunk,如果是lisp一类的strict evaluation语言,每一步的(a + x)都会计算,然后进入下一个调用。即使如此,这两个实现的区别还是很明显的,第一个是普通递归,第二个是尾递归。如果是lisp,第二个内存用量是不变的。总的来说,累加器在strict evaluation的语言里是更常见的。
    • 答案 2:

      我估计楼主问的是foldl,foldr中的累加器吧 比如sum可以用foldl实现 *Main> foldl (\acc x -> acc + x) 0 [1..10] 55 这个acc被称为累加器 foldl是个高阶函数,它接受一个函数f作为参数,然后传两个参数给这个函数f 一个是累加器的初始值,上例中是0,另一个是列表中的第一个元素 函数f对初始值和第一个元素运算后产生新的累加器(acc+x),然后再取列表中的第二个元素再做同样的运算,直到全部元素都计算完毕。 另外,上例也可以写成更简单的形式 *Main> foldl (+) 0 [1..10] 55

相关热词搜索:

上一篇:据说男人婚前觉得女人都不一样,婚后觉得都一样,是不是这样的?
下一篇:为什么很多语言要编译到 Javascript?