diff options
| author | Steve Lee <me@xiangyangli.com> | 2016-10-25 01:46:39 +0800 |
|---|---|---|
| committer | Steve Lee <me@xiangyangli.com> | 2016-10-25 01:46:39 +0800 |
| commit | 527c65ca2e4ec5095171345502dfa38a18e97a7f (patch) | |
| tree | 4b7bf522071fa60aef1eda3cc3fa81c62bfd0643 /SICP/ex2_17.scm | |
| parent | 9f3c370ed0af17c0b603847143ca9fbdf25536e7 (diff) | |
| download | Personal-527c65ca2e4ec5095171345502dfa38a18e97a7f.tar.xz Personal-527c65ca2e4ec5095171345502dfa38a18e97a7f.zip | |
add SICP exercise solutions
Diffstat (limited to 'SICP/ex2_17.scm')
| -rw-r--r-- | SICP/ex2_17.scm | 141 |
1 files changed, 141 insertions, 0 deletions
diff --git a/SICP/ex2_17.scm b/SICP/ex2_17.scm new file mode 100644 index 0000000..ac8f0b2 --- /dev/null +++ b/SICP/ex2_17.scm @@ -0,0 +1,141 @@ +(cons 1 + (cons 2 + (cons 3 + (cons 4 nil)))) + +(define one-through-four (list 1 2 3 4)) + +one-through-four + +(car one-through-four) +(cdr one-through-four) + +(define (list-ref items n) + (if (= n 0) + (car items) + (list-ref (cdr items) + (- n 1)))) + +(list-ref one-through-four 3) + +(define (length items) + (if (null? items) + 0 + (+ 1 (length (cdr items))))) + +(define (length items) + (define (length-iter a count) + (if (null? a) + count + (length-iter (cdr a) + (+ 1 count)))) + (length-iter items 0)) + +(define odds (list 1 3 5 7)) +(define squares (list 1 4 9 16 25)) + +(define (append list1 list2) + (if (null? list1) + list2 + (cons (car list1) + (append (cdr list1) + list2)))) + +(append odds squares) + +;; Exercise2.17 +(define (last-pair items) + (if (null? (cdr items)) + (car items) + (last-pair (cdr items)))) + +(last-pair (list 1 2 3 4 9 23)) + +;; Exercise2.18 +(define (reverse items) + (if (null? (cdr items)) + items + (append (reverse (cdr items)) + (cons (car items) nil)))) + +(list 4 3 2 1) +(reverse (list 1 2 3 4)) + +;; Exercise2.19 Counting change + +(define (count-change amount) + (cc amount 5)) + +(define us-coins + (list 50 25 10 5 1)) +(define uk-coins + (list 100 50 20 10 5 2 1 0.5)) + +(define (cc amount coin-values) + (cond ((= amount 0) + 1) + ((or (< amount 0) + (no-more? coin-values)) + 0) + (else + (+ (cc + amount + (except-first-denomination + coin-values)) + (cc + (- amount + (first-denomination + coin-values)) + coin-values))))) + +(define (first-denomination coin-values) + (car coin-values)) +(define (no-more? coin-values) + (null? coin-values)) +(define (except-first-denomination coin-values) + (if (null? coin-values) + null? + (cdr coin-values))) + +(cc 100 us-coins) + +;; Exercise2.20 + +(define (same-parity x . y) + (define (find-same-parity parity z) + (if (null? z) + nil + (if (= parity 1) + (if (odd? (car z)) + (cons (car z) (find-same-parity 1 (cdr z))) + (find-same-parity 1 (cdr z))) + (if (even? (car z)) + (cons (car z) (find-same-parity 2 (cdr z))) + (find-same-parity 2 (cdr z)))))) + (if (odd? x) + (cons x (find-same-parity 1 y)) + (cons x (find-same-parity 2 y)))) + +(define (same-parity first . rest) + (define (same-parity-iter source dist remainder-val) + (if (null? source) + dist + (same-parity-iter (cdr source) + (if (= (remainder (car source) 2) remainder-val) + (append dist (list (car source))) + dist) + remainder-val))) + (same-parity-iter rest (list first) (remainder first 2))) +(same-parity 1 2 3 4 5 6 7) +(same-parity 2 3 4 5 6 7) + +;; Exercise2.21 +(define (map proc items) + (if (null? items) + nil + (cons (proc (car items)) + (map proc (cdr items))))) + +(define (squares items) + (map (lambda (x) (* x x)) items)) +(squares (list 1 2 3 4)) |
