diff options
| author | Steve Lee <me@xiangyangli.com> | 2016-11-02 02:42:01 +0800 |
|---|---|---|
| committer | Steve Lee <me@xiangyangli.com> | 2016-11-02 02:42:01 +0800 |
| commit | 38f1804506888956e1fc95e3e405a366e17d4812 (patch) | |
| tree | 5c497c52d66292939a73cafdea519940636d2ac8 | |
| parent | 4baf0af60ba3e2bd27a181f52f3dcec312905fd4 (diff) | |
| download | Personal-38f1804506888956e1fc95e3e405a366e17d4812.tar.xz Personal-38f1804506888956e1fc95e3e405a366e17d4812.zip | |
add sicp ex
| -rw-r--r-- | SICP/ch2_2_2.scm | 87 | ||||
| -rw-r--r-- | SICP/ex2_17.scm | 47 |
2 files changed, 134 insertions, 0 deletions
diff --git a/SICP/ch2_2_2.scm b/SICP/ch2_2_2.scm new file mode 100644 index 0000000..fc6ca30 --- /dev/null +++ b/SICP/ch2_2_2.scm @@ -0,0 +1,87 @@ +(define x (cons (list 1 2) (list 3 4))) + +(define (length x) + (cond ((null? x) 0) + ((not (pair? x)) 1) + (else (+ (length (cdr x)) 1)))) + +(define (count-leaves x) + (cond ((null? x) 0) + ((not (pair? x)) 1) + (else (+ (count-leaves (car x)) + (count-leaves (cdr x)))))) + +(length x) +(count-leaves x) + +;; Exercise 2.24 +;; Length is wrong !!! +;; (car (cdr )) to get the left leaf + +(define list-1 (list 1 (list 2 (list 3 4)))) +(length list-1) +(count-leaves list-1) + +;; Exercise 2.25 +(car (cdr (car (cdr (cdr (list 1 3 (list 5 7) 9)))))) +(car (car (list (list 7)))) +(car (cdr (car (cdr (car (cdr (car (cdr (car (cdr (car (cdr (list 1 (list 2 (list 3 (list 4 (list 5 (list 6 7)))))))))))))))))) + +;; Exercise 2.26 +(define x (list 1 2 3)) +(define y (list 4 5 6)) + +(append x y) +(car (car (cons x y))) +(car (car (list x y))) + +(car (cdr (cons x y))) +(car (car (cdr (list x y)))) + +;; Exercise 2.27 + +!!! ;; Exercise2.18 +(define (reverse items) + (if (null? (cdr items)) + items + (append (reverse (cdr items)) + (cons (car items) nil)))) + +(define (deep-reverse items) + (if (null? (cdr items)) + (if (not (pair? (car items))) + items + (cons (deep-reverse (car items)) nil)) + (append (cond ((pair? (cdr items)) + (deep-reverse (cdr items))) + ((pair? (car (cdr items))) + (cons (deep-reverse (car (cdr items))) nil)) + ;; Some problem in else. + (else (deep-reverse (cdr items)))) + (cond ((pair? (car items)) + (cons (deep-reverse (car items)) nil)) + (else (cons (car items) nil)))))) + +(define y + (list (list 1 2) (list 3 4) (list 5 6))) + +(define z (list (list 1 2))) +(deep-reverse z) +(reverse z) + +(reverse y) +(deep-reverse y) + +(cons (deep-reverse (car (list (list 1 2)))) nil) + +(deep-reverse + (list 1 (list 2 3) 4 (list 5 6))) + +(define x + (list (list 1 2) (list 3 4))) +(list (list 1 2) (list 3 4)) +(reverse x) +(deep-reverse x) +(deep-reverse (list 3 4)) +(deep-reverse (list 1 2 3)) +(reverse (list 1 2 3)) diff --git a/SICP/ex2_17.scm b/SICP/ex2_17.scm index ac8f0b2..37e3eb3 100644 --- a/SICP/ex2_17.scm +++ b/SICP/ex2_17.scm @@ -139,3 +139,50 @@ one-through-four (define (squares items) (map (lambda (x) (* x x)) items)) (squares (list 1 2 3 4)) + +;; Exercise2.22 +(define (square x) (* x x)) +(define (square-list items) + (define (iter things answer) + (if (null? things) + answer + (iter (cdr things) + (cons (square (car things)) + answer)))) + (iter items nil)) +;; Modify one +(define (square-list items) + (define (iter things answer) + (if (null? things) + answer + (iter (cdr things) + (cons answer + (square + (car things)))))) + (iter items nil)) +(square-list (list 1 2 3 4 5)) +(list 1 4 9 16 25) +;; The right one; +(cons 1 (cons 4 (cons 9 (cons 16 (cons 25 nil))))) +;; The wrong one +(cons (cons (cons (cons (cons nil 1) 4) 9) 16) 25) + +;; Exercise2.23 +;; why nil print '() +(define (for-each proc items) + (define (iter proc items item) + (if (null? item) + nil + (proc item)) + (if (null? items) + nil + (iter proc (cdr items) (car items)))) + (iter proc items nil)) + +(for-each + (lambda (x) (newline) (display x)) + (list 57 321 88)) + +(cons (list 1 2) (list 3 4)) + + |
