aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Lee <me@xiangyangli.com>2016-11-02 02:42:01 +0800
committerSteve Lee <me@xiangyangli.com>2016-11-02 02:42:01 +0800
commit38f1804506888956e1fc95e3e405a366e17d4812 (patch)
tree5c497c52d66292939a73cafdea519940636d2ac8
parent4baf0af60ba3e2bd27a181f52f3dcec312905fd4 (diff)
downloadPersonal-38f1804506888956e1fc95e3e405a366e17d4812.tar.xz
Personal-38f1804506888956e1fc95e3e405a366e17d4812.zip
add sicp ex
-rw-r--r--SICP/ch2_2_2.scm87
-rw-r--r--SICP/ex2_17.scm47
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))
+
+