Решение упражнения 1.43 из SICP
Продолжим наше жонглирование пудовыми функциями с той же легкостью, с которой обычно управляются с подобными перышкам примитивными переменными. Воспользовавшись подсказкой об использовании ранее написанной процедуры compose и заметив, что повторенная n раз функция f - это композиция повторенной n-1 раз функции f с самой функцией f, легко получим такой код процедуры:
(define (repeated f n) (if (> n 1) (lambda (x) ((compose (repeated f (- n 1)) f) x)) f))
Результаты вычисления оказываются ожидаемыми:
> ((repeated square 2) 5) 625 > ((repeated inc 3) 5) 8
Никаких неожиданностей.
Comments
Comment from Sergey Khenkin
Date: November 4, 2007, 8:11 pm
Пример реализации repeated, порождающей итеративный процесс, можно подглядеть у Кена Дика - http://www.kendyck.com/archives/2007/06/04/solution-to-sicp-exercise-143/
Comment from SiGMan
Date: January 5, 2008, 10:13 am
По-моему тут есть кое-что лишее, лучше так:
(define (apply-ntimes-simple f n)
(if (> n 1)
(compose (apply-ntimes-simple f (- n 1)) f)
f ))
Comment from Sergey Khenkin
Date: January 6, 2008, 2:28 pm
Да, согласен, тут я перемудрил немножко. Проще нужно быть
[не по теме] Ник SiGMan имеет какое-то отношение к http://sigman.cs.umn.edu/ ?
Comment from gorilych
Date: July 16, 2008, 8:37 am
а так? (accumulate итеративна)
(define (repeated f n)
(accumulate compose identity (lambda (i) f) 1 inc n))
Write a comment