SICP 全笔记

Exercise 2.39. Complete the following definitions of reverse (exercise 2.18) in terms of fold-right and fold-left from exercise 2.38:

(define (reverse sequence)
  (fold-right (lambda (x y) <??>) nil sequence))
(define (reverse sequence)
  (fold-left (lambda (x y) <??>) nil sequence))

fold-right 实现 reverse

练习 2.38类似,我们可以把这个 fold-right 给展开。

(reverse '(1 2 3 4))
(op 1 (op 2 (op 3 (op 4 '()))))

在程序返回到 (op 3 (op 4 ‘())) 的时候,我们想要的结果是 (4 3),那么,op 操作就应该是 (append (op 4 ‘()) (list 3)),于是我们可以写出 fold-rightreverse 过程。

(define (reverse-1 sequence)
  (fold-right (lambda (x y)
                (append y (list x))) '() sequence))

fold-left 实现 reverse

展开这个 reverse:

(reverse '(1 2 3 4))
(op (op (op (op 1 '()) 2) 3) 4)

当程序范围到 (op (op 1 ‘()) 2) 的时候,我们期望能得到 (2 1),所以 op 操作应该是 (append (list 2) (op 1 ‘()))

(define (reverse-2 sequence)
  (fold-left (lambda (x y)
               (append (list y) x)) '() sequence))

测试

(load "../testframe.scm")
(let ((l '(1 2 3 4 5))
      (l1 '(1)))
  (assertequal? (reverse-1 l) '(5 4 3 2 1))
  (assertequal? (reverse-2 l) '(5 4 3 2 1))
  (assertequal? (reverse-1 l1) '(1))
  (assertequal? (reverse-2 l1) '(1)))