ikemonn's blog

技術ネタをちょこちょこと

【SICP】1.2.3~1.2.6

1.2.3 増加の程度

増加の程度:プロセスが入力が大きくなるにつれて必要とする資源のこと

1.2.4 べき乗

(define (expt b n)
        (if (= n 0) 
            1
          (* b (expt b (- n 1)))))

上記は線形再帰的プロセスでθ(n)のステップと、θ(n)のスペースを必要とする。

しかし、以下のように書くとθ(n)のステップとθ(1)のスペースで済む。

(define (expt b n)
  (expt-iter b n 1))

(define (expt-iter b counter product)
  (if (= counter 0)
      product
      (expt-iter b 
                 (- counter 1)
                 (* b product))))

逐次平方を使うと以下のように書ける。

(define (fast-expt b n)
        (cond ((= n 0) 1)
              ((even? n) (square (fast-expt b (/ n 2))))
              (else (* b (fast-expt b (- n 1))))))

(define (even? n)
  (= (remainder n 2) 0))

(define (square n)
  (* n n))

1.2.5 最大公約数

ユークリッド互除法

(define (gcd a b)
  (if (= b 0)
      a
      (gcd b (remainder a b))))

1.2.6 除数の探索

最小でかつ整数の除数を見つける

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

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

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

(define (square n)
  (* n n))

参考

計算機プログラムの構造と解釈

計算機プログラムの構造と解釈