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-right 的 reverse 过程。
(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)))