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