Code Review

Compare your solutions

    #| Для этого упражнения нет проверок.
Любое решение будет считаться успешным ответом. |#

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

(gcd 206 40)

; Normal-order evaluation -> 18 remainder calls

; (if (= 40 0))
(gcd 40 (remainder 206 40))
; (if (= (remainder 206 40) 0)) #1 - first remainder call
(gcd (remainder 206 40) (remainder 40 (remainder 206 40)))
; (if (= (remainder 40 (remainder 206 40)) 0)) #2
; (if (= (remainder 40 6) 0)) #3

(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)) #4-5
; (if (= (remainder 6 (remainder 40 6)) 0)) #6
; (if (= (remainder 6 4) 0)) #7

(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))
; #8-10

; (if (= (remainder (remainder 40 6) (remainder 6 (remainder 40 6))) 0)) #11-12
; (if (= (remainder 4 (remainder 6 4)) 0)) #13
; (if (= (remainder 4 2) 0)) -> #t #14

(remainder (remainder 206 40) (remainder 40 (remainder 206 40))); #15-16
(remainder 6 (remainder 40 6)); #17
(remainder 6 4); -> 2 #18

; Applicative-order evaluation  -> 4 remainder calls

(gcd 40 (remainder 206 40)); #1
(gcd 40 6)
(gcd 6 (remainder 40 6)); #2
(gcd 6 4)
(gcd 4 (remainder 6 4)); #3
(gcd 4 2)
(gcd 2 (remainder 4 2)); #4
(gcd 2 0); -> 2