Код Ревью
Сравни свои решения
#| Для этого упражнения нет проверок.
Любое решение будет считаться успешным ответом. |#
(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. С большими числами разница будет особо заметна