Open Source WEB

##(link2sicp "book-Z-H-11.html#%_thm_1.20" "Exercise 1.20")

解答例

正規順序

(gcd 206 40)
--> ((lambda (a b)
       (if (= b 0)
           a
           (gcd b (remainder a b))))
     206 40)
--> (if (= 40 0)
        206
        (gcd 40 (remainder 206 40)))
--> (if #f
        206
        (gcd 40 (remainder 206 40)))
--> (gcd 40 (remainder 206 40))
--> ((lambda (a b)
       (if (= b 0) a (gcd b (remainder a b))))
     40
     (remainder 206 40))
--> (if (= (remainder 206 40) 0) ;; ☆
        40
        (gcd (remainder 206 40) (remainder 40 (reaminder 206 40))))
--> (if (= 6 0)
        40
        (gcd (remainder 206 40)
             (remainder 40 (reaminder 206 40))))
--> (if #f
        40
        (gcd (remainder 206 40)
             (remainder 40 (reaminder 206 40))))
--> (gcd (remainder 206 40)
         (remainder 40 (reaminder 206 40)))
--> ((lambda (a b)
       (if (= b 0) a (gcd b (remainder a b))))
     (remainder 206 40)
     (remainder 40 (reaminder 206 40)))
--> (if (= (remainder 40 (reaminder 206 40)) 0) ;; ☆
        (remainder 206 40)
        (gcd (remainder 40 (reaminder 206 40))
             (remainder (remainder 206 40)
                        (remainder 40 (remainder 206 40)))))
--> (if (= (remainder 40 6) 0) ;; ☆
        (remainder 206 40)
        (gcd (remainder 40 (reaminder 206 40))
             (remainder (remainder 206 40)
                        (remainder 40 (remainder 206 40)))))
--> (if (= 4 0)
        (remainder 206 40)
        (gcd (remainder 40 (reaminder 206 40))
             (remainder (remainder 206 40)
                        (remainder 40 (remainder 206 40)))))
--> (if #f
        (remainder 206 40)
        (gcd (remainder 40 (reaminder 206 40))
             (remainder (remainder 206 40)
                        (remainder 40 (remainder 206 40)))))
--> (gcd (remainder 40 (reaminder 206 40))
        (remainder (remainder 206 40)
                   (remainder 40 (remainder 206 40)))))
--> ((lambda (a b)
       (if (= b 0) a (gcd b (remainder a b))))
     (remainder 40 (reaminder 206 40))
     (remainder (remainder 206 40)
                (remainder 40 (remainder 206 40))))
--> (if (= (remainder (remainder 206 40) ;; ☆
                      (remainder 40 (remainder 206 40)))
           0)
        (remainder 40 (reaminder 206 40))
        (gcd (remainder (remainder 206 40)
                        (remainder 40 (remainder 206 40)))
             (remainder (remainder 40 (reaminder 206 40))
                        (remainder (remainder 206 40)
                                   (remainder 40 (remainder 206 40))))))
--> (if (= (remainder 6
                      (remainder 40 (remainder 206 40))) ;; ☆
           0)
        (remainder 40 (reaminder 206 40))
        (gcd (remainder (remainder 206 40)
                        (remainder 40 (remainder 206 40)))
             (remainder (remainder 40 (reaminder 206 40))
                        (remainder (remainder 206 40)
                                   (remainder 40 (remainder 206 40))))))
--> (if (= (remainder 6 (remainder 40 6)) ;; ☆
           0)
        (remainder 40 (reaminder 206 40))
        (gcd (remainder (remainder 206 40)
                        (remainder 40 (remainder 206 40)))
             (remainder (remainder 40 (reaminder 206 40))
                        (remainder (remainder 206 40)
                                   (remainder 40 (remainder 206 40))))))
--> (if (= (remainder 6 4) ;; ☆
           0)
        (remainder 40 (reaminder 206 40))
        (gcd (remainder (remainder 206 40)
                        (remainder 40 (remainder 206 40)))
             (remainder (remainder 40 (reaminder 206 40))
                        (remainder (remainder 206 40)
                                   (remainder 40 (remainder 206 40))))))
--> (if (= 2 0)
        (remainder 40 (reaminder 206 40))
        (gcd (remainder (remainder 206 40)
                        (remainder 40 (remainder 206 40)))
             (remainder (remainder 40 (reaminder 206 40))
                        (remainder (remainder 206 40)
                                   (remainder 40 (remainder 206 40))))))
--> (if #f
        (remainder 40 (reaminder 206 40))
        (gcd (remainder (remainder 206 40)
                        (remainder 40 (remainder 206 40)))
             (remainder (remainder 40 (reaminder 206 40))
                        (remainder (remainder 206 40)
                                   (remainder 40 (remainder 206 40))))))
--> (gcd (remainder (remainder 206 40)
                    (remainder 40 (remainder 206 40)))
         (remainder (remainder 40 (reaminder 206 40))
                    (remainder (remainder 206 40)
                               (remainder 40 (remainder 206 40)))))
--> ((lambda (a b)
       (if (= b 0) a (gcd b (remainder a b))))
     (remainder (remainder 206 40)
                (remainder 40 (remainder 206 40)))
     (remainder (remainder 40 (reaminder 206 40))
                (remainder (remainder 206 40)
                           (remainder 40 (remainder 206 40)))))
--> (if (= (remainder (remainder 40 (reaminder 206 40)) ;; ☆
                      (remainder (remainder 206 40)
                                 (remainder 40 (remainder 206 40))))
           0)
        (remainder (remainder 206 40)
                   (remainder 40 (remainder 206 40)))
        (gcd (remainder (remainder 40 (reaminder 206 40))
                        (remainder (remainder 206 40)
                                   (remainder 40 (remainder 206 40))))
             (remainder (remainder (remainder 206 40)
                                   (remainder 40 (remainder 206 40)))
                        (remainder (remainder 40 (reaminder 206 40))
                                   (remainder (remainder 206 40)
                                              (remainder 40 (remainder 206 40)))))))
--> (if (= (remainder (remainder 40 6) ;; ☆
                      (remainder (remainder 206 40)
                                 (remainder 40 (remainder 206 40))))
           0)
        (remainder (remainder 206 40)
                   (remainder 40 (remainder 206 40)))
        (gcd (remainder (remainder 40 (reaminder 206 40))
                        (remainder (remainder 206 40)
                                   (remainder 40 (remainder 206 40))))
             (remainder (remainder (remainder 206 40)
                                   (remainder 40 (remainder 206 40)))
                        (remainder (remainder 40 (reaminder 206 40))
                                   (remainder (remainder 206 40)
                                              (remainder 40 (remainder 206 40)))))))
--> (if (= (remainder 4
                      (remainder (remainder 206 40)
                                 (remainder 40 (remainder 206 40)))) ;; ☆
           0)
        (remainder (remainder 206 40)
                   (remainder 40 (remainder 206 40)))
        (gcd (remainder (remainder 40 (reaminder 206 40))
                        (remainder (remainder 206 40)
                                   (remainder 40 (remainder 206 40))))
             (remainder (remainder (remainder 206 40)
                                   (remainder 40 (remainder 206 40)))
                        (remainder (remainder 40 (reaminder 206 40))
                                   (remainder (remainder 206 40)
                                              (remainder 40 (remainder 206 40)))))))
--> (if (= (remainder 4
                      (remainder (remainder 206 40) ;; ☆
                                 (remainder 40 6)))
           0)
        (remainder (remainder 206 40)
                   (remainder 40 (remainder 206 40)))
        (gcd (remainder (remainder 40 (reaminder 206 40))
                        (remainder (remainder 206 40)
                                   (remainder 40 (remainder 206 40))))
             (remainder (remainder (remainder 206 40)
                                   (remainder 40 (remainder 206 40)))
                        (remainder (remainder 40 (reaminder 206 40))
                                   (remainder (remainder 206 40)
                                              (remainder 40 (remainder 206 40)))))))
--> (if (= (remainder 4
                      (remainder 6 (remainder 40 6))) ;; ☆
           0)
        (remainder (remainder 206 40)
                   (remainder 40 (remainder 206 40)))
        (gcd (remainder (remainder 40 (reaminder 206 40))
                        (remainder (remainder 206 40)
                                   (remainder 40 (remainder 206 40))))
             (remainder (remainder (remainder 206 40)
                                   (remainder 40 (remainder 206 40)))
                        (remainder (remainder 40 (reaminder 206 40))
                                   (remainder (remainder 206 40)
                                              (remainder 40 (remainder 206 40)))))))
--> (if (= (remainder 4
                      (remainder 6 4)) ;; ☆
           0)
        (remainder (remainder 206 40)
                   (remainder 40 (remainder 206 40)))
        (gcd (remainder (remainder 40 (reaminder 206 40))
                        (remainder (remainder 206 40)
                                   (remainder 40 (remainder 206 40))))
             (remainder (remainder (remainder 206 40)
                                   (remainder 40 (remainder 206 40)))
                        (remainder (remainder 40 (reaminder 206 40))
                                   (remainder (remainder 206 40)
                                              (remainder 40 (remainder 206 40)))))))
--> (if (= (remainder 4 2) 0) ;; ☆
        (remainder (remainder 206 40)
                   (remainder 40 (remainder 206 40)))
        (gcd (remainder (remainder 40 (reaminder 206 40))
                        (remainder (remainder 206 40)
                                   (remainder 40 (remainder 206 40))))
             (remainder (remainder (remainder 206 40)
                                   (remainder 40 (remainder 206 40)))
                        (remainder (remainder 40 (reaminder 206 40))
                                   (remainder (remainder 206 40)
                                              (remainder 40 (remainder 206 40)))))))
--> (if (= 0 0)
        (remainder (remainder 206 40)
                   (remainder 40 (remainder 206 40)))
        (gcd (remainder (remainder 40 (reaminder 206 40))
                        (remainder (remainder 206 40)
                                   (remainder 40 (remainder 206 40))))
             (remainder (remainder (remainder 206 40)
                                   (remainder 40 (remainder 206 40)))
                        (remainder (remainder 40 (reaminder 206 40))
                                   (remainder (remainder 206 40)
                                              (remainder 40 (remainder 206 40)))))))
--> (if #t
        (remainder (remainder 206 40)
                   (remainder 40 (remainder 206 40)))
        (gcd (remainder (remainder 40 (reaminder 206 40))
                        (remainder (remainder 206 40)
                                   (remainder 40 (remainder 206 40))))
             (remainder (remainder (remainder 206 40)
                                   (remainder 40 (remainder 206 40)))
                        (remainder (remainder 40 (reaminder 206 40))
                                   (remainder (remainder 206 40)
                                              (remainder 40 (remainder 206 40)))))))
--> (remainder (remainder 206 40) ;; ☆
               (remainder 40 (remainder 206 40)))
--> (remainder 6 (remainder 40 (remainder 206 40))) ;; ☆
--> (remainder 6 (remainder 40 6)) ;; ☆
--> (remainder 6 4) ;; ☆
--> 2

正規順序では remainder は 18 回評価される

作用的順序評価

(gcd 206 40)
--> ((lambda (a b)
       (if (= b 0) a (gcd b (remainder a b))))
     206
     40)
--> (if (= 40 0) 206 (gcd 40 (remainder 206 40)))
--> (if #f 206 (gcd 40 (remainder 206 40)))
--> (gcd 40 (remainder 206 40)) ;; ☆
--> (gcd 40 6)
--> ((lambda (a b)
       (if (= b 0) a (gcd b (remainder a b))))
     40
     6)
--> (if (= 6 0) 40 (gcd 6 (remainder 40 6)))
--> (if #f 40 (gcd 6 (remainder 40 6)))
--> (gcd 6 (remainder 40 6)) ;; ☆
--> (gcd 6 4)
--> ((lambda (a b)
       (if (= b 0) a (gcd b (remainder a b))))
     6
     4)
--> (if (= 4 0) 6 (gcd 4 (remainder 6 4)))
--> (if #f 6 (gcd 4 (remainder 6 4)))
--> (gcd 4 (reaminder 6 4)) ;; ☆
--> (gcd 4 2)
--> ((lambda (a b)
       (if (= b 0) a (gcd b (remainder a b))))
     4
     2)
--> (if (= 2 0) 4 (gcd 2 (remainder 4 2)))
--> (if #f 4 (gcd 2 (remainder 4 2)))
--> (gcd 2 (remainder 4 2)) ;; ☆
--> (gcd 2 0)
--> ((lambda (a b)
       (if (= b 0) a (gcd b (remainder a b))))
     2
     0)
--> (if (= 0 0) 2 (gcd 0 (remainder 2 0)))
--> (if #t 2 (gcd 0 (remainder 2 0)))
--> 2

作用的順序では remainder は 4 回評価される。

コード

##(sicp-answer-code "ex-1.20.scm")

このサイトは、 IPA の「平成15年度オープンソフトウエア活用基盤整備事業」 の委託事業として開発されたKahuaで試験的に運用しております。

Copyright (c) 2004-2007 株式会社タイムインターメディア About Us