sicp 1.20

如下求最大公约数的代码:

 

 

Java代码 
  1. (define (gcd a b)  
  2.   (if (= b 0)  
  3.       a  
  4.       (gcd b (remainder a b))))  

 

 

对于(gcd 206 40)

1.正则序:

(gcd 206 40)

->(if (= 40 0)

      206

      (gcd 40 (remainder 206 40)))

->(gcd 40 (remainder 206 40))

->(if (= (remainder 206 40) 0)

      40

      (gcd (remainder 206 40)

           (remainder 40 (remainder 206 40))))

->(if (= 6 0)

      40

      (gcd (remainder 206 40)

           (remainder 40 (remainder 206 40)))); 第1次remainder

->(gcd (remainder 206 40)

       (remainder 40 (remainder 206 40)))

->(if (= (remainder 40 (remainder 206 40)) 0)

      (remainder 206 40)

      (gcd (remainder 40 (remainder 206 40))

           (remainder (remainder 206 40) (remainder 40 (remainder 206 40))))

->(if (= 4 0)

      (remainder 206 40)

      (gcd (remainder 40 (remainder 206 40))

           (remainder (remainder 206 40) (remainder 40 (remainder 206 40)))); 第2-3次remainder

->(gcd (remainder 40 (remainder 206 40))

       (remainder (remainder 206 40) (remainder 40 (remainder 206 40))))

->(if (= (remainder (remainder 206 40) (remainder 40 (remainder 206 40))) 0)

      (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 (= 2 0)

      (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))))); 第4-7次remainder

->(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 (= (remainder (remainder 40 (remainder 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 (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 40 (remainder 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 (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 40 (remainder 206 40)) (remainder (remainder 206 40) (remainder 40 (remainder 206 40)))))); 第8-14次remainder

 ->(remainder (remainder 206 40) (remainder 40 (remainder 206 40))

->2; 第15-18次remainder

 

一共18次remainder

 

2.应用序:

(gcd 206 40)

->(if (= 40 0)

      206

      (gcd 40 (remainder 206 40)))

->(gcd 40 (remainder (206 40)))

->(gcd 40 6); 第1次remainder

->(if (= 6 0)

      40

      (gcd 6 (remainder 40 6)))

->(gcd 6 (remainder 40 6))

->(gcd 6 4); 第2次remainder

->(if (= 4 0)

      6

      (gcd 4 (remainder 6 4)))

->(gcd 4 (remainder 6 4))

->(gcd 4 2); 第3次remainder

->(if (= 2 0)

      4

      (gcd 2 (remainder 4 2)))

->(gcd 2 (remainder 4 2))

->(gcd 2 0); 第4次remainder

->(if (= 0 0)

      2

      (gcd 0 (remainder 2 0)))

->2

 

一共4次remainder

你可能感兴趣的:(SICP)