Решение упражнения 1.43 из SICP

2 November, 2007 (20:50) | Решения упражнений

Продолжим наше жонглирование пудовыми функциями с той же легкостью, с которой обычно управляются с подобными перышкам примитивными переменными. Воспользовавшись подсказкой об использовании ранее написанной процедуры 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