(define (gcd a b) (if (= b 0) a (gcd b (remainder a b)))) ;; Normal order evaluation ; (gcd 206 40) ; ; (if (= 40 0) ; 206 ; (gcd 40 (remainder 206 40)))) ; ; (gcd 40 (remainder 206 40)) ; ; (if (= (remainder 206 40) 0) ; remainder evaluated 1x ; 40 ; (gcd (remainder 206 40) (remainder 40 (remainder 206 40)))) ; ; (gcd (remainder 206 40) (remainder 40 (remainder 206 40))) ; ; (if (= (remainder 40 (remainder 206 40)) 0) ; remainder evaluation 2x ; (remainder 206 40) ; (gcd (remainder 40 (remainder 206 40)) (remainder (remainder 206 40) (remainder 40 (remainder 206 40))))) ; ; (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 evaluated 4x ; (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)))))) ; (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)))) ; remainder evaluated 7x ; 0) ; ; a ; (remainder (remainder 206 40) ; (remainder 40 (remainder 206 40))) ; remainder evaluated 4x ; (gcd ... )) ; => remainder evaluated 18x ;; Normal order evaluation ; (gcd 206 40) ; (gcd 40 (remainder 206 40)) ; remainder evaluated ; (gcd 40 6) ; (gcd 6 (remainder 40 6)) ; remainder evaluated ; (gcd 6 4) ; (gcd 4 (remainder 6 4)) ; remainder evaluated ; (gcd 4 2) ; => remainder evaluated 3x