From 79eb38248533a667b677edc59a760a409544b797 Mon Sep 17 00:00:00 2001 From: Darcy Shen Date: Thu, 9 May 2024 16:06:21 +0800 Subject: [PATCH] =?UTF-8?q?SICP=2010:=20=E4=BB=A3=E7=A0=81=E6=B8=85?= =?UTF-8?q?=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SICP/code10.tm | 674 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 674 insertions(+) create mode 100644 SICP/code10.tm diff --git a/SICP/code10.tm b/SICP/code10.tm new file mode 100644 index 0000000..78150b3 --- /dev/null +++ b/SICP/code10.tm @@ -0,0 +1,674 @@ + + +> + +<\body> + + + <\session|scheme|default> + <\unfolded-io|Scheme] > + (define one-through-four (list 1 2 3 4)) + <|unfolded-io> + (1 2 3 4) + + + <\unfolded-io|Scheme] > + (car one-through-four) + <|unfolded-io> + 1 + + + <\unfolded-io|Scheme] > + (cdr one-through-four) + <|unfolded-io> + (2 3 4) + + + <\unfolded-io|Scheme] > + (car (cdr one-through-four)) + <|unfolded-io> + 2 + + + <\unfolded-io|Scheme] > + (cons 10 one-through-four) + <|unfolded-io> + (10 1 2 3 4) + + + <\unfolded-io|Scheme] > + (cons 5 one-through-four) + <|unfolded-io> + (5 1 2 3 4) + + + <\input|Scheme] > + \; + + + + \; + + <\session|scheme|default> + <\unfolded-io|Scheme] > + (define (list-ref items n) + + \ \ (if (= n 0) + + \ \ \ \ \ \ (car items) + + \ \ \ \ \ \ (list-ref (cdr items) (- n 1)))) + <|unfolded-io> + list-ref + + + <\unfolded-io|Scheme] > + (define squares (list 1 4 9 16 25)) + <|unfolded-io> + (1 4 9 16 25) + + + <\unfolded-io|Scheme] > + (list-ref squares 3) + <|unfolded-io> + 16 + + + <\input|Scheme] > + \; + + + + <\session|scheme|default> + <\unfolded-io|Scheme] > + (define (length items) + + \ \ (if (null? items) + + \ \ \ \ \ \ 0 + + \ \ \ \ \ \ (+ 1 (length (cdr items))))) + <|unfolded-io> + length + + + <\unfolded-io|Scheme] > + (define odds (list 1 3 5 7)) + <|unfolded-io> + (1 3 5 7) + + + <\unfolded-io|Scheme] > + (length odds) + <|unfolded-io> + 4 + + + <\input|Scheme] > + \; + + + + <\session|scheme|default> + <\unfolded-io|Scheme] > + (append squares odds) + <|unfolded-io> + (1 4 9 16 25 1 3 5 7) + + + <\unfolded-io|Scheme] > + (append odds squares) + <|unfolded-io> + (1 3 5 7 1 4 9 16 25) + + + <\input|Scheme] > + \; + + + + <\session|scheme|default> + <\unfolded-io|Scheme] > + (define (scale-list items factor) + + \ \ (if (null? items) + + \ \ \ \ \ \ () + + \ \ \ \ \ \ (cons (* (car items) factor) + + \ \ \ \ \ \ \ \ \ \ \ \ (scale-list (cdr items) factor)))) + <|unfolded-io> + scale-list + + + <\unfolded-io|Scheme] > + (scale-list (list 1 2 3 4 5) 10) + <|unfolded-io> + (10 20 30 40 50) + + + <\input|Scheme] > + \; + + + + <\session|scheme|default> + <\unfolded-io|Scheme] > + (map abs (list -10 2.5 -11.6 17)) + <|unfolded-io> + (10 2.5 11.6 17) + + + <\unfolded-io|Scheme] > + (map (lambda (x) (* x x)) + + \ \ \ \ \ (list 1 2 3 4)) + <|unfolded-io> + (1 4 9 16) + + + <\input|Scheme] > + \; + + + + + + <\session|scheme|default> + <\unfolded-io|Scheme] > + (define (count-leaves x) + + \ \ (cond ((null? x) 0) \ + + \ \ \ \ \ \ \ \ ((not (pair? x)) 1) + + \ \ \ \ \ \ \ \ (else (+ (count-leaves (car x)) + + \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (count-leaves (cdr x)))))) + <|unfolded-io> + count-leaves + + + <\input|Scheme] > + \; + + + + <\session|scheme|default> + <\unfolded-io|Scheme] > + (define x (cons (list 1 2) (list 3 4))) + <|unfolded-io> + ((1 2) 3 4) + + + <\unfolded-io|Scheme] > + (length x) + <|unfolded-io> + 3 + + + <\unfolded-io|Scheme] > + (count-leaves x) + <|unfolded-io> + 4 + + + <\unfolded-io|Scheme] > + (list x x) + <|unfolded-io> + (((1 2) 3 4) ((1 2) 3 4)) + + + <\unfolded-io|Scheme] > + (length (list x x)) + <|unfolded-io> + 2 + + + <\unfolded-io|Scheme] > + (count-leaves (list x x)) + <|unfolded-io> + 8 + + + <\input|Scheme] > + \; + + + + <\session|scheme|default> + <\unfolded-io|Scheme] > + (define (scale-tree tree factor) + + \ \ (cond ((null? tree) ()) + + \ \ \ \ \ \ \ \ ((not (pair? tree)) (* tree factor)) + + \ \ \ \ \ \ \ \ (else (cons (scale-tree (car tree) factor) + + \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (scale-tree (cdr tree) + factor))))) + <|unfolded-io> + scale-tree + + + <\unfolded-io|Scheme] > + (scale-tree (list 1 (list 2 (list 3 4) 5) (list 6 7)) + + \ \ \ \ \ \ \ \ \ \ \ \ 10) + <|unfolded-io> + (10 (20 (30 40) 50) (60 70)) + + + <\input|Scheme] > + \; + + + + + + + + <\session|scheme|default> + <\unfolded-io|Scheme] > + (define (square x) (* x x)) + <|unfolded-io> + square + + + <\unfolded-io|Scheme] > + (map square (list 1 2 3 4 5)) + <|unfolded-io> + (1 4 9 16 25) + + + <\input|Scheme] > + \; + + + + <\session|scheme|default> + <\unfolded-io|Scheme] > + (define (filter predicate sequence) + + \ \ (cond ((null? sequence) ()) + + \ \ \ \ \ \ \ \ ((predicate (car sequence)) + + \ \ \ \ \ \ \ \ \ (cons (car sequence) + + \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (filter predicate (cdr sequence)))) + + \ \ \ \ \ \ \ \ (else (filter predicate (cdr sequence))))) + <|unfolded-io> + filter + + + <\unfolded-io|Scheme] > + (filter odd? (list 1 2 3 4 5)) + <|unfolded-io> + (1 3 5) + + + <\input|Scheme] > + \; + + + + \; + + <\session|scheme|default> + <\unfolded-io|Scheme] > + (define (accumulate op initial sequence) + + \ \ (if (null? sequence) + + \ \ \ \ \ \ initial + + \ \ \ \ \ \ (op (car sequence) + + \ \ \ \ \ \ \ \ \ \ (accumulate op initial (cdr sequence))))) + <|unfolded-io> + accumulate + + + <\unfolded-io|Scheme] > + (accumulate + 0 (list 1 2 3 4 5)) + <|unfolded-io> + 15 + + + <\unfolded-io|Scheme] > + (accumulate * 1 (list 1 2 3 4 5)) + <|unfolded-io> + 120 + + + <\unfolded-io|Scheme] > + (accumulate cons () (list 1 2 3 4 5)) + <|unfolded-io> + (1 2 3 4 5) + + + <\input|Scheme] > + \; + + + + <\session|scheme|default> + <\unfolded-io|Scheme] > + (define (enumerate-interval low high) + + \ \ (if (\ low high) + + \ \ \ \ \ \ () + + \ \ \ \ \ \ (cons low (enumerate-interval (+ low 1) high)))) + <|unfolded-io> + enumerate-interval + + + <\unfolded-io|Scheme] > + (enumerate-interval 2 7) + <|unfolded-io> + (2 3 4 5 6 7) + + + <\input|Scheme] > + \; + + + + <\session|scheme|default> + <\unfolded-io|Scheme] > + (define (enumerate-tree tree) + + \ \ (cond ((null? tree) ()) + + \ \ \ \ \ \ \ \ ((not (pair? tree)) (list tree)) + + \ \ \ \ \ \ \ \ (else (append (enumerate-tree (car tree)) + + \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (enumerate-tree (cdr + tree)))))) + <|unfolded-io> + enumerate-tree + + + <\unfolded-io|Scheme] > + (enumerate-tree (list 1 (list 2 (list 3 4)) 5)) + <|unfolded-io> + (1 2 3 4 5) + + + <\input|Scheme] > + \; + + + + <\session|scheme|default> + <\unfolded-io|Scheme] > + (define (square x) (* x x)) + <|unfolded-io> + square + + + <\unfolded-io|Scheme] > + (define (fib n) + + \ \ (cond ((= n 0) 0) + + \ \ \ \ \ \ \ \ ((= n 1) 1) + + \ \ \ \ \ \ \ \ (else (+ (fib (- n 1)) + + \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (fib (- n 2)))))) + <|unfolded-io> + fib + + + <\unfolded-io|Scheme] > + (define (list-fib-squares n) + + \ \ (accumulate cons + + \ \ \ \ \ \ \ \ \ \ \ \ \ \ () + + \ \ \ \ \ \ \ \ \ \ \ \ \ \ (map square + + \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (map + + \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (enumerate-interval 0 + n))))) + <|unfolded-io> + list-fib-squares + + + <\unfolded-io|Scheme] > + (list-fib-squares 10) + <|unfolded-io> + (0 1 1 4 9 25 64 169 441 1156 3025) + + + <\unfolded-io|Scheme] > + (define (product-of-squares-of-odd-elements sequence) + + \ \ (accumulate * + + \ \ \ \ \ \ \ \ \ \ \ \ \ \ 1 + + \ \ \ \ \ \ \ \ \ \ \ \ \ \ (map + + \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (filter odd? sequence)))) + <|unfolded-io> + product-of-squares-of-odd-elements + + + <\unfolded-io|Scheme] > + (product-of-squares-of-odd-elements (list 1 2 3 4 5)) + <|unfolded-io> + 225 + + + <\input|Scheme] > + \; + + + + + + <\session|scheme|default> + <\unfolded-io|Scheme] > + (define (square x) (* x x)) + <|unfolded-io> + square + + + <\unfolded-io|Scheme] > + (define (smallest-divisor n) + + \ \ (find-divisor n 2)) + <|unfolded-io> + smallest-divisor + + + <\unfolded-io|Scheme] > + (define (find-divisor n test-divisor) + + \ \ (cond ((\ (square test-divisor) n) n) + + \ \ \ \ \ \ \ \ ((divides? test-divisor n) test-divisor) + + \ \ \ \ \ \ \ \ (else (find-divisor n (+ test-divisor 1))))) + <|unfolded-io> + find-divisor + + + <\unfolded-io|Scheme] > + (define (divides? a b) + + \ \ (= (remainder b a) 0)) + <|unfolded-io> + divides? + + + <\unfolded-io|Scheme] > + (define (prime? n) + + \ \ (= n (smallest-divisor n))) + <|unfolded-io> + prime? + + + <\input|Scheme] > + \; + + + + \; + + <\session|scheme|default> + <\unfolded-io|Scheme] > + (define (flatmap proc seq) + + \ \ (accumulate append () (map proc seq))) + <|unfolded-io> + flatmap + + + <\unfolded-io|Scheme] > + (define (prime-sum? pair) + + \ \ (prime? (+ (car pair) (cadr pair)))) + <|unfolded-io> + prime-sum? + + + <\unfolded-io|Scheme] > + (define (make-pair-sum pair) + + \ \ (list (car pair) (cadr pair) (+ (car pair) (cadr pair)))) + <|unfolded-io> + make-pair-sum + + + <\unfolded-io|Scheme] > + (define (prime-sum-pairs n) + + \ \ (map make-pair-sum + + \ \ \ \ \ \ \ (filter prime-sum? + + \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (flatmap + + \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (lambda (i) + + \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (map (lambda (j) (list i j)) + + \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (enumerate-interval 1 (- + i 1)))) + + \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (enumerate-interval 1 n))))) + <|unfolded-io> + prime-sum-pairs + + + <\unfolded-io|Scheme] > + (prime-sum-pairs 4) + <|unfolded-io> + ((2 1 3) (3 2 5) (4 1 5) (4 3 7)) + + + <\input|Scheme] > + \; + + + + \; + + <\session|scheme|default> + <\unfolded-io|Scheme] > + (define (remove item sequence) + + \ \ (filter (lambda (x) (not (= x item))) + + \ \ \ \ \ \ \ \ \ \ sequence)) + <|unfolded-io> + remove + + + <\unfolded-io|Scheme] > + (define (permutations s) + + \ \ (if (null? s) \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ; empty set? + + \ \ \ \ \ \ (list ()) \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ; sequence + containing empty set + + \ \ \ \ \ \ (flatmap (lambda (x) + + \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (map (lambda (p) (cons x p)) + + \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (permutations (remove x + s)))) + + \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ s))) + <|unfolded-io> + permutations + + + <\unfolded-io|Scheme] > + (permutations (list 1 2 3)) + <|unfolded-io> + ((1 2 3) (1 3 2) (2 1 3) (2 3 1) (3 1 2) (3 2 1)) + + + <\input|Scheme] > + \; + + + + +<\initial> + <\collection> + + + + + +<\references> + <\collection> + > + > + > + > + > + + + +<\auxiliary> + <\collection> + <\associate|toc> + |math-font-series||Representing + Sequences> |.>>>>|> + + + |math-font-series||Hierarchical + Structures> |.>>>>|> + + + |math-font-series||Sequences + as Conventional Interfaces> |.>>>>|> + + + |Sequence Operations + |.>>>>|> + > + + |Nested Mappings + |.>>>>|> + > + + + \ No newline at end of file