Умножение с помощью сложения
Алгоритмы возведения в степень из этого раздела основаны на повторяющемся умножении. Подобным же образом можно производить умножение с помощью повторяющегося сложения. Следующая процедура умножения (в которой предполагается, что наш язык способен только складывать, но не умножать) аналогична процедуре 
expt
:
(define (* a b)
  (if (= b 0)
      0
      (+ a (* a (- b 1)))))
Этот алгоритм затрачивает количество шагов, линейно пропорциональное 
b
. Предположим теперь, что, наряду со сложением, у нас есть операции 
double
, которая удваивает целое число, и 
halve
, которая делит (четное) число на 2. Используя их, напишите процедуру умножения 
fast-mul
, аналогичную 
fast-expt
, которая затрачивает логарифмическое число шагов.
Комментарии отсутствуют.