Ваше решение не является итеративным. Итеративная процедура - это та, которая ничего не вызывает после рекурсивного вызова, и это не так в следующих двух строках:
(square (exp-iter b (/ 2 counter) product))
(* b (exp-iter b (- counter 1) product))
После вызова exp-iter
в первой строке вы передаетерезультат до square
, а во второй строке вы умножаете результат на b
. Сравните это с хвостовым рекурсивным решением:
(define (exp-iter b counter product)
(cond ((= counter 0)
product)
((even? counter)
(exp-iter (square b) (/ counter 2) product))
(else
(exp-iter b (- counter 1) (* b product)))))
Обратите внимание, что после вызова exp-iter
ничего не остается, и процедура просто возвращает свое значение. Умный компилятор обнаружит это и преобразует рекурсивный вызов в цикл, который будет использовать постоянный объем стековой памяти (вместо увеличения при каждом рекурсивном вызове.)