都是初學者,寫了半天才寫好,汗~~
練習1.3:
(define (max2 a b)
(cond ((> a b) a)
(else b)
)
)
(define (max3 a b c)
(cond
((> c (max2 a b)) c)
(else (max2 a b))
)
)
(define (maxsum a b c)
(cond
((= a (max3 a b c)) (+ a (max2 b c)))
((= b (max3 a b c)) (+ b (max2 a c)))
(else (+ c (max2 a b)))
)
)
運行結果:
> (maxsum 1 2 3)
5
> (maxsum 7 4 5)
12
> (maxsum 1.2 23 0.7)
24.2
等到我們學習到函數的時候再把這兩個max函數組合到一起
練習1.7(求平方根)
(define (sqrt_ok nFrom nLastFrom)
(< (/ (abs (- nFrom nLastFrom)) nFrom) 0.00000001)
)
(define (avrage x y)
(/ (+ x y) 2)
)
(define (improve guess x)
(avrage guess (/ x guess))
)
(define (sqrt_impl nFrom nData)
(cond ((sqrt_ok nFrom (improve nFrom nData)) nFrom)
(else
(sqrt_impl (improve nFrom nData) nData)
)
)
)
(define (sqrt x)
(sqrt_impl 1.0 x)
)
運行結果:
> (sqrt 2)
1.4142135623746899
> (* 1.4142135623746899 1.4142135623746899)
2.0000000000045106
> (sqrt 100)
10.000000000139897
> (sqrt 10000)
100.00000025490743
> (sqrt 1000000)
1000.0000000000118
練習1.8(求立方根)在求平方根的函數上面做了一點變化:
(define (sqrt_ok nFrom nLastFrom)
(< (/ (abs (- nFrom nLastFrom)) nFrom) 0.00000001)
)
(define (improve guess x)
(/
(+ (/ x (* guess guess)) (* guess 2))
3)
)
(define (sqrt_impl3 nFrom nData)
(cond ((sqrt_ok nFrom (improve nFrom nData)) nFrom)
(else
(sqrt_impl3 (improve nFrom nData) nData)
)
)
)
(define (sqrt3 x)
(sqrt_impl3 1.0 x)
)
運行結果:
> (sqrt3 9)
2.0800838232385224
> (sqrt3 8)
2.000000000012062
> (sqrt3 27)
3.0000000000000977
> (sqrt3 2)
1.2599210500177698
>