-
Notifications
You must be signed in to change notification settings - Fork 0
/
sicp2-38_fold.rkt
57 lines (49 loc) · 1.36 KB
/
sicp2-38_fold.rkt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#lang scheme
(display "2.38 - left right fold") (newline)
(define (fold-left op initial seq)
(define (iter result rest)
(if (null? rest) result
(iter (op result (car rest)) (cdr rest))
)
)
(iter initial seq)
)
(define (list-reverse seq)
(define (iter result rest)
(if (null? rest) result
(iter (cons (car rest) result) (cdr rest))
)
)
(iter '() seq)
)
(define (list-reverse2 seq) ; use the fold-left
(fold-left (lambda (x y) (cons y x)) '() seq)
)
(define (accumulate op initial seq)
(if (null? seq) initial
(op (car seq) (accumulate op initial (cdr seq)))
)
)
(define fold-right accumulate)
(define (append seq1 seq2)
(fold-right cons seq2 seq1)
)
(append '() '((1 2) (3 4))) (newline)
(define (list-reverse3 seq) ; use the fold-right
;(fold-right (lambda (x y) (append y (list x))) '() seq) ; also work
(fold-right (lambda (x y) (fold-right cons (list x) y)) '() seq)
)
(list-reverse '(1 2 3 4))
(list-reverse2 '(1 2 3 4))
(list-reverse3 '(1 2 3 4))
;(fold-right / 1 '(1 2 3)) (newline)
;(fold-left / 1 '(1 2 3)) (newline)
;
;(fold-right / 1 '(1 2 4 8)) (newline)
;(fold-left / 1 '(1 2 4 8)) (newline)
;
;(fold-right list '() '(1 2 3)) (newline)
;(fold-left list '() '(1 2 3)) (newline)
;
;(fold-right cons '() '(1 2 3)) (newline)
;(fold-left cons '() '(1 2 3)) (newline)