Add solutions from 1-1 to 1-8
parent
d8ce021359
commit
6ef385c8c5
|
@ -0,0 +1,133 @@
|
|||
(display "ex-1.1 - solutions in comments\n")
|
||||
; 10 -> 10
|
||||
; (+ 5 3 4) -> 12
|
||||
; (- 9 1) -> 8
|
||||
; (/ 6 2) -> 3
|
||||
; (+ (* 2 4) (- 4 6)) -> 6
|
||||
; (define a 3) -> a
|
||||
; (define b (+ a 1)) -> b
|
||||
; (+ a b (* a b)) -> 19
|
||||
; (= a b) -> #f
|
||||
; (if (and (> b a) (< b (* a b))) b a) ; -> b -> 4
|
||||
; (cond ((= a 4) 6)
|
||||
; ((= b 4) (+ 6 7 a))
|
||||
; (else 25)) -> 126
|
||||
; (+ 2 (if (> b a) b a)) -> 6
|
||||
; (* (cond ((> a b) a)
|
||||
; ((< a b) b)
|
||||
; (else -1))
|
||||
; (+ a 1)) ->
|
||||
|
||||
(display "ex-1.2 - ")
|
||||
(display (/ (+ 5 4 (- 2 (- 3 (+ 6 (/ 4 5)))))
|
||||
(* 3 (- 6 2) (- 2 7))))
|
||||
(newline)
|
||||
|
||||
(display "ex-1.3 - ")
|
||||
|
||||
(define (sum-squares a b) (+ (* a a) (* b b)))
|
||||
|
||||
(define (sum-squares-max a b c)
|
||||
(cond ((and (>= a c) (>= b c)) (sum-squares a b))
|
||||
((and (>= a b) (>= c b)) (sum-squares a c))
|
||||
(else (sum-squares b c))))
|
||||
|
||||
(display (sum-squares-max 2 -6 1))
|
||||
(newline)
|
||||
|
||||
(display "ex-1.4 - Operator becomes + or - depending on the value of b\n")
|
||||
; (define (a-plus-abs-b a b)
|
||||
; ((if (> b 0) + -) a b))
|
||||
|
||||
(display "ex-1.5 - Only normal-order terminates\n")
|
||||
;(define (p) (p))
|
||||
;(define (test x y)
|
||||
; (if (= x 0) 0 y))
|
||||
;(display (if (= 0 0) 0 (p)))
|
||||
; Will not terminate:
|
||||
;(display (test 0 (p)))
|
||||
|
||||
(display "\n; Square roots via Newton's Method") (newline)
|
||||
(define (sqrt-iter guess x)
|
||||
(if (good-enough? guess x)
|
||||
guess
|
||||
(sqrt-iter (improve guess x)
|
||||
x)))
|
||||
|
||||
(define (improve guess x)
|
||||
(average guess (/ x guess)))
|
||||
|
||||
(define (average a b) (/ (+ a b) 2))
|
||||
|
||||
(define (good-enough? guess x)
|
||||
(< (abs (- (square guess) x)) 0.0001))
|
||||
|
||||
(define (square a) (* a a))
|
||||
|
||||
(define (sqrt x) (sqrt-iter 1.0 x))
|
||||
|
||||
(display (sqrt 9))
|
||||
(newline)
|
||||
(display (sqrt (+ 100 37)))
|
||||
(newline)
|
||||
(display (sqrt (+ (sqrt 2) (sqrt 3))))
|
||||
(newline)
|
||||
(display (square (sqrt 1000)))
|
||||
(newline)
|
||||
|
||||
(display "\nex-1.6 - see comment\n")
|
||||
|
||||
(define (new-if predicate then-clause else-clause)
|
||||
(cond (predicate then-clause)
|
||||
(else else-clause)))
|
||||
|
||||
;(define (sqrt-iter guess x)
|
||||
; (new-if (good-enough? guess x)
|
||||
; guess
|
||||
; (sqrt-iter (improve guess x)
|
||||
; x)))
|
||||
|
||||
;(display (sqrt 9))
|
||||
|
||||
; sqrt-iter doesn't terminate because new-if is evaluated in applicative
|
||||
; order which results in an endless recursion of sqrt-iter -> new-if.
|
||||
|
||||
(display "\nex-1.7 - see comments for explanation\nwrong behavior:\n")
|
||||
(display (sqrt 9)) (newline)
|
||||
; Very small numbers don't work because the delta between the initial
|
||||
; guess and the expected solution is in a smaller dimension than the
|
||||
; value used in good-enough?
|
||||
(display (sqrt 0.0000001)) (newline)
|
||||
; For very large numbers, good-enough? will never return true because the
|
||||
; representation of floating point numbers is not accurate enough for their
|
||||
; difference to ever fall below the tolerance value.
|
||||
;(display (sqrt 9732402478147293489)) (newline)
|
||||
(display "better:\n")
|
||||
|
||||
(define (good-enough2? guess new-guess)
|
||||
(< (/ (abs (- new-guess guess)) new-guess) 0.00000000001))
|
||||
|
||||
(define (sqrt-iter-precise guess x)
|
||||
(if (good-enough2? guess (improve guess x))
|
||||
guess
|
||||
(sqrt-iter-precise (improve guess x)
|
||||
x)))
|
||||
|
||||
(display (sqrt 9)) (newline)
|
||||
(display (sqrt 0.00000001)) (newline)
|
||||
|
||||
; (display (sqrt 9732402478147293489))
|
||||
; works with racket and newer MIT Scheme versions
|
||||
|
||||
(display "\nex-1.8 - cube-root") (newline)
|
||||
(define (improve-cubic y x) (/ (+ (/ x (* y y)) (* 2 y)) 3))
|
||||
|
||||
(define (cbrt-iter guess x)
|
||||
(if (good-enough2? guess (improve-cubic guess x))
|
||||
guess
|
||||
(cbrt-iter (improve-cubic guess x) x)))
|
||||
|
||||
(define (cbrt x) (cbrt-iter 1.0 x))
|
||||
|
||||
(display (cbrt 27)) (newline)
|
||||
(display (cbrt 0.001)) (newline)
|
Loading…
Reference in New Issue