Типичное решение для преобразования рекурсивного процесса в итеративный процесс состоит в том, чтобы заручиться помощью аккумулятора.
В любом случае repeated
должен будет вернуть процедуру. Одно решение могло бы использовать именованный let
внутри возвращаемой процедуры, которая повторяется n
раз, отслеживая результаты в аккумуляторе. Вот версия repeated
, которая возвращает унарную процедуру; обратите внимание, что здесь нет проверки ввода, поэтому вызовы типа ((repeated f 0) 'arg)
приведут к проблемам.
(define (repeated f n)
(lambda (x)
(let iter ((n n)
(acc x))
(if (= n 1) (f acc)
(iter (- n 1)
(f acc))))))
Именованные выражения let
очень удобны для таких вещей, но вы также можете определить вспомогательную процедуру сделать то же самое. Я оставлю это решение в качестве упражнения для OP.
scratch.rkt> ((repeated sqr 3) 2)
256
scratch.rkt> ((repeated add1 8) 6)
14