Hatena::Groupcsnagoya-sicp

クラなんとかの日記 このページをアンテナに追加 RSSフィード

 | 

2008-11-10どうでもいいことで躓いた

1.20

| 20:00 | 1.20 - クラなんとかの日記 を含むブックマーク はてなブックマーク - 1.20 - クラなんとかの日記 1.20 - クラなんとかの日記 のブックマークコメント

if の評価順序は,正規,作用のどちらも条件から評価する.(問題1.5に記述あり)

正規順序の場合.remainder は,18回使用.

;; 展開前
(gcd 206 40)

;; 1st expand (一回目の展開)
;; remainder : 0 回使用
(if (= 40 0) ; => #f
    206
    (gcd 40
         (remainder 206 40)))

;; if の展開
(gcd 40
     (remainder 206 40))

;; 2nd expand (二回目の展開)
;; remainder : 1 回使用(if の条件式部で 1回,現在 0回)
(if (= (remainder 206 40) 0) ; => (= 6 0) => #f
    40
    (gcd (remainder 206 40)
         (remainder 40 (remainder 206 40))))

;; if condition (if の条件式部分の展開)
(gcd (remainder 206 40)
     (remainder 40 (remainder 206 40)))

;; 3rd expand (3回目の展開)
;; remainder : 3 回使用(if の条件式部で 2回,現在 1回)
(if (= (remainder 40 (remainder 206 40)) 0) ; => (= (remainder 40 6) 0) => (= 4 0) => #f
    (remainder 206 40)
    (gcd (remainder 40 (remainder 206 40))
         (remainder (remainder 206 40) (remainder 40 (remainder 206 40)))))

;; if condition (if の条件式の展開)
(gcd (remainder 40 (remainder 206 40))
     (remainder (remainder 206 40) (remainder 40 (remainder 206 40))))

;; 4th expand (4回目の展開)
;; remainder : 7 回使用(if の条件式部で 4回,現在 3回)
(if (= (remainder (remainder 206 40) (remainder 40 (remainder 206 40))) 0) ; (= (remainder 6 (remainder 40 6)) 0) => (= (remainder 6 4) 0) => (= 2 0) => #f
    (remainder 40 (remainder 206 40))
    (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))))))

;; if condition (if の条件式の展開)
(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)))))

;; 5th expand (5回目の展開)
;; remainder : 14 回使用(if の条件式部で 7回,現在 7回)
(if (= (remainder (remainder 40 (remainder 206 40)) (remainder (remainder 206 40) (remainder 40 (remainder 206 40)))) 0) ; (= (remainder (remainder 40 6) (remainder 6 (remainder 40 6))) 0) => (= (remainder 4 (remainder 6 4)) 0) => (= (remainder 4 2) 0) => (= 0 0) => #t
    (remainder (remainder 206 40) (remainder 40 (remainder 206 40)))
    (gcd (remainder (remainder 40 (remainder 206 40)) (remainder (remainder 206 40) (remainder 40 (remainder 206 40))))
         (remainder (remainder (remainder 206 40) (remainder 40 (remainder 206 40))) (remainder (remainder 40 (remainder 206 40)) (remainder (remainder 206 40) (remainder 40 (remainder 206 40)))))))

;; if condition (if の条件式の展開)
;; remainder : 18 回使用(全体で 4回,現在 14回)
(remainder (remainder 206 40) (remainder 40 (remainder 206 40)))

;; 計算1
(remainder 6 (remainder 40 6))

;; 計算2
(remainder 6 4)

;; 計算3
2

作用順序の場合.remainder は,4 回使用.

;; 展開前
(gcd 206 40)

;; gcd の展開
(if (= 40 0) ; => #f
    206
    (gcd 40
         (remainder 206 40)))

;; if の展開
;; remainder : 1 回使用(引数部 1回,現在 0回)
(gcd 40
     (remainder 206 40))

;; 引数の評価
(gcd 40 6)

;; gcd の展開
(if (= 6 0) ; => #f
    40
    (gcd 6
         (remainder 40 6)))

;; if の展開
;; remainder : 2 回使用(引数部 1回,現在 1回)
(gcd 6
     (remainder 40 6))

;; 引数の評価
(gcd 6 4)

;; gcd の展開
(if (= 4 0) ; => #f
    6
    (gcd 4
         (remainder 6 4)))

;; if の展開
;; remainder : 3 回使用(引数部 1回,現在 2回)
(gcd 4
     (remainder 6 4))

;; 引数の評価
(gcd 4 2)

;; gcd の展開
(if (= 2 0) ; => #f
    4
    (gcd 2
         (remainder 4 2)))

;; if の展開
;; remainder : 4 回使用(引数部 1回,現在 3回)
(gcd 2
     (remainder 4 2))

;; 引数の評価
(gcd 2 0)

;; gcd の展開
(if (= 0 0) ; => #t
    2
    (gcd 0
         (remainder 2 0)))

;; if の展開
2
 |