Код Ревью

Сравни свои решения

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

(define (square x) (* x x))

(define (even? n)
  (= (remainder n 2) 0))

(define (fast-expt b n)
  (cond ((= n 0) 1)
        ((even? n) (square (fast-expt b (/ n 2))))
        (else (* b (fast-expt b (- n 1))))))

; Старая процедура
(define (expmod base exp m)
  (cond ((= exp 0) 1)
        ((even? exp)
         (remainder (square (expmod base (/ exp 2) m))
                    m))
        (else
         (remainder (* base (expmod base (- exp 1) m))
                    m))))

; Новая процедура
(define (expmod base exp m)
  (remainder (fast-expt base exp) m))

; Я думаю, что Лиза не права. Функция действительно корректна, стала проще для понимания и проще для написания, но в тоже время при сравнении не сложно заметить, что в старой процедуре все операции из-за применения remainder будут происходить с меньшими числами, < m, когда в новой процедуре сначала вычисляется потенциально большое base^exp, а потом уже берется remainder. С большими числами разница будет особо заметна