計算機程序的構造和解釋第一章習題參考答案(DrPacket中編譯通過)

都是初學者,寫了半天才寫好,汗~~

練習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
> 



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章