Умножение с помощью сложения

Алгоритмы возведения в степень из этого раздела основаны на повторяющемся умножении. Подобным же образом можно производить умножение с помощью повторяющегося сложения. Следующая процедура умножения (в которой предполагается, что наш язык способен только складывать, но не умножать) аналогична процедуре expt :

(define (* a b)
  (if (= b 0)
      0
      (+ a (* a (- b 1)))))

Этот алгоритм затрачивает количество шагов, линейно пропорциональное b . Предположим теперь, что, наряду со сложением, у нас есть операции double , которая удваивает целое число, и halve , которая делит (четное) число на 2. Используя их, напишите процедуру умножения fast-mul , аналогичную fast-expt , которая затрачивает логарифмическое число шагов.


Комментарии отсутствуют.

Необходима авторизация

Вы должны авторизоваться для создания комментария.

Вход