159 lines
3.6 KiB
Scheme
159 lines
3.6 KiB
Scheme
|
|
; A collection of SICP excercises
|
|
; these are all my solutions from reading
|
|
; the book
|
|
|
|
; 1.01 - basic expressions
|
|
(assert (= (+ (* 2 4) (- 4 6)) 6))
|
|
(define a 3)
|
|
(define b (+ a 1))
|
|
(assert (= (+ a b (* a b)) 19))
|
|
|
|
|
|
(assert (= (if (and (> b a) (< b (* a b)))
|
|
b
|
|
a) 4))
|
|
|
|
(assert (= (cond ((= a 4) 6)
|
|
((= b 4) (+ 6 7 a))
|
|
(else 25)) 16))
|
|
|
|
(assert (= (+ 2 (if (> b a) b a )) 6))
|
|
|
|
(assert (= (* (cond ((> a b) a)
|
|
((< a b) b)
|
|
(else -1))
|
|
(+ a 1)) 16))
|
|
|
|
; 1.03 - largest squares
|
|
(define (sqr x) (* x x))
|
|
|
|
(define (largest-squares x y z)
|
|
(cond ((and (< z x) (< z y)) (+ (sqr x) (sqr y)))
|
|
((and (< y x) (> y z)) (+ (sqr x) (sqr z)))
|
|
(else (+ (sqr y) (sqr z)))
|
|
))
|
|
|
|
(assert (= (largest-squares 3 4 5) (+ 25 16)))
|
|
(assert (= (largest-squares 3 5 4) (+ 25 16)))
|
|
|
|
; 1.14 change counter
|
|
(define (count-change amount) (cc amount 5))
|
|
|
|
(define (cc amount kinds-of-coins)
|
|
(cond ((= amount 0) 1)
|
|
((or (< amount 0) (= kinds-of-coins 0)) 0)
|
|
(else (+ (cc amount
|
|
(- kinds-of-coins 1))
|
|
(cc (- amount
|
|
(first-denomination kinds-of-coins))
|
|
kinds-of-coins)))))
|
|
|
|
(define (first-denomination kinds-of-coins)
|
|
(cond ((= kinds-of-coins 1) 1)
|
|
((= kinds-of-coins 2) 5)
|
|
((= kinds-of-coins 3) 10)
|
|
((= kinds-of-coins 4) 25)
|
|
((= kinds-of-coins 5) 50)))
|
|
|
|
(display "counting change: ")
|
|
(display (count-change 75))
|
|
(newline)
|
|
|
|
; 1.16 - fast powers
|
|
(define (exp-fast b n) (exp-iter b n 1))
|
|
|
|
(define (exp-iter b n product)
|
|
(cond ((= n 0) product)
|
|
; b^n = (b^2) n/2
|
|
((even? n) (exp-iter (* b b) (/ n 2) product))
|
|
; b^n = b * b^n-1
|
|
(else (exp-iter b (- n 1) (* product b)))))
|
|
|
|
(assert (= (exp-fast 5 4) 625))
|
|
(assert (= (exp-fast 2 8) 256))
|
|
|
|
; 1.17 - fast multiply
|
|
|
|
(define (double a) (+ a a))
|
|
(define (halve a) (/ a 2))
|
|
|
|
(define (fast-mul a b) (fast-mul-iter a b 0))
|
|
|
|
(define (fast-mul-iter a b sum)
|
|
(cond ((= b 0) sum)
|
|
((even? b) (fast-mul-iter (double a) (halve b) sum))
|
|
(else (fast-mul-iter a (- b 1) (+ sum a)))))
|
|
|
|
(assert (= (fast-mul 3 4) 12))
|
|
(assert (= (fast-mul 100 10) 1000))
|
|
|
|
; 1.19 fibonacci
|
|
|
|
(define (fib-helper n a b p q)
|
|
(cond
|
|
((= n 0) b)
|
|
((even? n) (fib-helper (/ n 2)
|
|
a
|
|
b
|
|
(+ (* p p) (* q q))
|
|
(+ (* 2 q p) (* q q ))
|
|
))
|
|
|
|
(else
|
|
(fib-helper
|
|
(- n 1)
|
|
(+ (* b q) (* a q) (* a p))
|
|
(+ (* b p) (* a q))
|
|
p
|
|
q))))
|
|
|
|
(define (fib n)
|
|
(fib-helper n 1 0 0 1))
|
|
|
|
(assert (= (fib 5) 5))
|
|
(assert (= (fib 7) 13))
|
|
(assert (= (fib 8) 21))
|
|
|
|
; 2.21 - square list
|
|
|
|
(define (square-list items)
|
|
(if (null? items)
|
|
items
|
|
(cons (* (car items) (car items)) (square-list (cdr items)))))
|
|
|
|
(define (square-list2 items)
|
|
(map (lambda (x) (* x x)) items))
|
|
|
|
(display (square-list (list 1 2 3 4)))
|
|
(newline)
|
|
(display (square-list2 (list 4 5 6 7)))
|
|
|
|
; bank accounts
|
|
(define (make-account val)
|
|
(lambda (action)
|
|
(if (eq? action 'deposit)
|
|
(lambda (n) (set! val (+ val n)))
|
|
(lambda (n) (set! val (- val n))))))
|
|
|
|
(define justin (make-account 100))
|
|
(define ryan (make-account 200))
|
|
((justin 'deposit) 20)
|
|
((ryan 'withdraw) 20)
|
|
|
|
(gc-flip)
|
|
|
|
(assert (= ((justin 'withdraw) 0) 120))
|
|
(assert (= ((ryan 'deposity) 0) 180))
|
|
|
|
; and or expansion
|
|
(let ((a 1))
|
|
(if (and (= a 0) (garbage here))
|
|
(assert 0)
|
|
'pass)
|
|
|
|
(if (or (= a 1) (garbage here))
|
|
'pass
|
|
(assert 0)))
|
|
|