【发布时间】:2015-11-16 02:36:38
【问题描述】:
我已经接近理解 foldr 和 foldl 但还没有完全理解。
我知道foldr 基本上是从“从右到左”在列表上执行某些功能的堆栈实现。
所以对于foldr:
(define (fn-for-lon lon)
(cond [(empty? lon) 0]
[else
(+ (first lon)
(fn-for-lon (rest lon))]))
基本上相当于:
(foldr + 0 lon)
我知道foldl 基本上是尾递归的累加器版本,从“左到右”。
所以对于foldl:
(define (fn-for-lon lon0)
(local [(define (fn-for-lon lon acc)
(cond [(empty? lon) acc]
[else
(fn-for-lon (rest lon) (+ acc (first lon)))]
(fn-for-lon lon0)))
基本上相当于:
(foldl + 0 lon)
但是一旦你引入两个变量会发生什么?我试图阅读该主题,但我无法理解它,因为没有人谈论幕后发生的事情。
我真的很困惑第二个参数是“base”还是“init”,或者它只是取决于函数中是否采用了一个或两个变量。在我给出的 foldl 示例中,它似乎是 init acc 值(我想它最终是基本情况),但在 foldr 中它将是基本情况。是不是因为我只对proc使用了一个操作符?
(foldr (lambda (a b) (cons (add1 a) b)) empty (list 1 2 3 4))
像上面这样的事情我真的只是失去了所有的理解。我知道该怎么做,但不知道后台发生了什么。这使我在更复杂的问题中迷失了方向。
这是完全相同的东西吗?b 只是empty? b 是否临时替代(rest lon)?
(define (fn-for-lon lon)
(cond [(empty? lon) empty]
[else
(cons (add1 (first lon))
(fn-for-lon (rest lon)))]))
【问题讨论】:
-
看看this answer是否有帮助。
标签: scheme racket abstraction fold higher-order-functions