SICP問題1.20

今回は最大公約数に関する問題。

↓は最大公約数を求める手続き。

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

でこの手続きを使って(gcd 206 40)を正規順序、作用的順序で評価していったら
remainderは何回実行されるか。

正規順序

(gcd 206 40) 0
(if (= 40 0) 206 (gcd 40 (remainder 206 40)))0
(if (= 40 0) 206 (if (= 6 0) 40 (gcd 6 (remainder 40 6)))) 1
(if (= 40 0) 206 (if (= 6 0) 40 (if (= 4 0) 6 (gcd 4 (remainder 6 4))))) 2
(if (= 40 0) 206 (if (= 6 0) 40 
                 (if (= 4 0) 6 (if (= 2 0) 4 (gcd 2 (remainder 4 )))))) 3
4

で、4回*1

作用的順序

(gcd 206 40) 0
(gcd 40 
     (remainder 206 40))) 0

(gcd (remainder 206 40) 
     (remainder 40 (remainder 206 40)))) 1

(gcd (remainder 40 (remainder 206 40)) 
     (remainder (remainder 206 40) (remainder 40 (remainder 206 40)))) 3

(gcd (remainder (remainder 206 40) (remainder 40 (remainder 206 40)))
     (remainder (remainder 40 (remainder 206 40)) 
     (remainder (remainder 206 40) (remainder 40 (remainder 206 40)))) 7

(remainder (remainder 206 40) (remainder 40 (remainder 206 40))) 14
18

で、18回。

*1:行末の数字はそこまでの実行回数