alaskanの解答

基本的にコーディングがある問題のみを解答していきます。

;;; 問題1.3

(define (sum2 a b c)
  (if (> a b)
      (if (> b c)
          (+ (square a) (square b))
          (+ (square a) (square c)))
      (if (> a c)
          (+ (square b) (square a))
          (+ (square b) (square c)))))

;;; 問題1.7

改造前
gosh> (sqrt 0.00000002)
0.03125021312471016
gosh> (sqrt 20000000000)
141421.35623730952
(define (sqrt-iter prev guess x)
  (if (good-enough? prev guess)
      guess
      (sqrt-iter guess (improve guess x)
                 x)))
(define (good-enough? prev guess)
  (< (abs (/ (- prev guess) guess)) 0.001))
(define (sqrt x)
  (sqrt-iter 0.0 1.0 x))
改造後
gosh> (sqrt 0.00000002)
1.4142135875671105e-4
gosh> (sqrt 2000000000000)
1414213.5625134502

;;; 問題1.8

(define (cubic-iter prev guess x)
  (if (good-enough? prev guess)
      guess
      (cubic-iter guess (cubic-improve guess x)
                 x)))
(define (cubic-improve guess x)
  (/ (+ (/ x (square guess)) (* 2 guess )) 3))
(define (cubic-root x)
  (cubic-iter 0.0 1.0 x))

;;; 問題1.11

;; 再帰的
(define (recursive-f n)
  (if (< n 3)
      n
      (+ (recursive-f (- n 1)) (* 2 (recursive-f (- n 2))) (* 3 (recursive-f (- n 3))))))

;; 反復的
(define (iterative-f n)
  (define (f-iter count a b c)
    (if (= count n)
        a
        (f-iter (+ count) (+ a (* 2 b) (*3 c)) a b)))
  (if (< n 3)
      n
      (f-iter 3 4 2 0)))

;;; 問題1.12

;; パスカルの三角形の項を計算(i,jは1から数える)
(define (pascal-term i j)
  (if (or (= j 1) (= i j))
      1
      (+ (pascal-term (- i 1) (- j 1)) (pascal-term (- i 1) j))))

;;; 問題1.16

(define (iterative-expt b n)
  (define (expt-iter a b n)
    (if (= n 0)
        a
        (if (even? n)
            (expt-iter a (square b) (/ n 2))
            (expt-iter (* a b) b (- n 1)))))
  (expt-iter 1 b n))

;;; 問題1.17

(define (double x)
  (+ x x))

(define (halve x)
  (if (= 0 (remainder x 2))
      (/ x 2)
      (/ (- x 1) 2)))

(define (multi a b)
  (if (= b 0)
      0
      (if (even? b)
          (multi (double a) (halve b))
          (+ a (multi a (- b 1))))))

;;; 問題1.18

(define (iterative-multi a b)
  (define (multi-iter n a b)
    (if (= b 0)
        n
        (if (even? b)
            (multi-iter n (double a) (halve b))
            (multi-iter (+ n a) a (- b 1)))))
  (multi-iter 0 a b))

;;; 問題1.19

(define (fib n)
  (fib-iter 1 0 0 1 n))

(define (fib-iter a b p q count)
  (cond ((= count 0) b)
        ((even? count)
         (fib-iter a
                   b
                   (+ (square p) (square q)) ; compute p'
                   (+ (* 2 p q) (square q))  ; compute q'
                   (/ count 2)))
        (else (fib-iter (+ (* b q) (* a q) (* a p))
                        (+ (* b p) (* a q))
                        p
                        q
                        (- count 1)))))

;;; 問題1.21

(define (smallest-divisor n)
  (find-divisor n 2))

(define (find-divisor n test-divisor)
  (cond ((> (square test-divisor) n) n)
        ((divides? test-divisor n) test-divisor)
        (else (find-divisor n (+ test-divisor 1)))))

(define (divides? a b)
  (= (remainder b a) 0))

;;; 問題1.28

(use math.mt-random)
(define m (make <mersenne-twister> :seed (sys-time)))
(define (expmod base exp m)
  (cond ((= exp 0) 1)
        ((even? exp)
         (remainder (square (expmod base (/ exp 2) m))
                    m))
        (else
         (remainder (* base (expmod base (- exp 1) m))
                    m))))

(define (fermat-test n)
  (define (try-it a)
    (= (expmod a n n) a))
  (try-it (+ 1 (mt-random-integer m (- n 1)))))

(define (fermat-all-test n)
  (let iter ((i (- n 1)))
    (cond ((= i 1) #t)                  ;全ての数について#t
          ((= (expmod i n n) i)         ;fermat-test
           (iter (- i 1)))              ;fetmat-testにパスしたらiを減らしてループ
          (else #f))))                  ;fermat-testにパスしなければ#f

;;; 問題1.29

(define (sum term a next b)
  (let iter ((result 0) (i a))
    (if (> i b)
        result
        (iter (+ result (term i)) (next i)))))
(define (simpson f a b n)
  (let* ((ne (if (even? n) n (+ n 1)))
         (h (/ (- b a) ne))
         (y (lambda (i) (f (+ a (* i h)))))
         (next (lambda (n) (+ n 2))))
    (/ (* h (+ (f a)
               (* 4 (sum y 1 next (- ne 1)))
               (* 2 (sum y 2 next (- ne 2)))
               (f b))) 3)))

;;; 問題1.30

(define (sum term a next b)
  (let iter ((result 0) (i a))
    (if (> i b)
        result
        (iter (+ result (term i)) (next i)))))

;;; 問題1.31

;; a
(define (product term a next b)
  (let iter ((result 1) (i a))
    (if (> i b)
        result
        (iter (* result (term i)) (next i)))))

(define (factorial n)
  (product (lambda (x) x) 1 (lambda (x) (+ x 1)) n))

(define (wallis n)
  (* 4.0 (product (lambda (x) (/ (* (+ x 2) (+ x 4)) (square (+ x 3))))
                     0 (lambda (x) (+ x 2)) n)))

;; b
(define (product-recursive term a next b)
  (if (> a b)
      1
      (* (term a) (product-recursive term (next a) next b))))

;;; 問題1.32

;; a
(define (accumulate combiner null-value term a next b)
    (let iter ((result null-value) (i a))
    (if (> i b)
        result
        (iter (combiner result (term i)) (next i)))))
(define (sum term a next b)
  (accumulate + 0 term a next b))
(define (product term a next b)
  (accumulate * 1 term a next b))

;; b
(define (accumulate-recursive combiner null-value term a next b)
  (if (> a b)
      null-value
      (combiner (term a) (accumelate-recursive combiner null-value term (next a) next b))))

;;; 問題1.33

(define (filtered-accumulate combiner filter null-value term a next b)
  (let iter ((result null-value) (i a))
    (if (> i b)
        result
        (iter (if (filter i)
                  (combiner result (term i))
                  result)
              (next i)))))

;; a
(define (sum-square-prime a b)
  (filtered-accumulate + fermat-all-test 0 square a (lambda (x) (+ x 1)) b))

;; b
(define (gcd-product n)
  (filtered-accumulate * (lambda (x) (= (gcd n x) 1)) 1 (lambda (x) x) 1 (lambda (x) (+ x 1)) n))

;;; 問題1.36

(define tolerance 0.00001)

(define ([[fixed-point]] f first-guess)
  (define (close-enough? v1 v2)
    (< (/ (abs (- v1 v2)) v2) tolerance))
  (define (try guess i)
    (display i)
    (display " : ")
    (display guess)
    (newline)
    (let ((next (/ (+ (f guess) guess) 2.0)))
      (if (close-enough? guess next)
          next
          (try next (+ i 1)))))
  (try first-guess 0))

;;; 問題1.37

;; a
(define (cont-frac n d k)
  (define (sub-cont-frac i)
    (if (= i k) (/ (n i) (d i))
        (/ (n i) (+ (d i) (sub-cont-frac (+ i 1))))))
  (sub-cont-frac 1))

;; b
(define (cont-frac n d k)
  (let iter ((result 0) (i k))
    (if (= i 0) result
        (iter (/ (n i) (+ (d i) result)) (- i 1)))))

;;; 問題1.38

(define (euler-e)
  (+ (cont-frac (const 1.0) (lambda (i)
                              (if (= (remainder i 3) 2)
                                  (* (+ (quotient i 3) 1) 2)
                                  1)) 10)
     2))

;;; 問題1.39

(define (tan-cf x k)
  (cont-frac (lambda (i)
               (if (= i 1) x
                   (- (square x))))
             (lambda (i) (- (* 2 i) 1)) k))

;;; 問題1.42

(define (compose f g)
  (lambda (x) (f (g x))))

;;; 問題1.43

;; 問題1.32のaccumulateを使用する
(define (repeated f n)
  (accumulate compose identity (const f) 1 inc n))

;;; 問題1.44

(define dx 0.00001)
(define (smoothing f)
  (/ (+ (f (- x dx)) (f x) (f (+ x dx))) 3.0))
(define (n-fold-smoothing (f n))
  (repeated smoothing n))

;;; 問題1.45



;;; 問題1.46

タグ:

+ タグ編集
  • タグ:
最終更新:2008年01月11日 13:26
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。