Повторное применение функций в Схеме? - PullRequest
2 голосов
/ 30 октября 2008

Если f - числовая функция, а n - положительное целое число, то мы можем сформировать n-е повторное применение f, которое определяется как функция, значение которой в точке x равно f (f (... (f (x). )) ...)). Например, если f - это функция x + 1, то n-е повторное применение f - это функция x + n. Если f - операция возведения в квадрат числа, то n-е повторное применение f - это функция, которая поднимает свой аргумент до 2-й степени. Напишите процедуру, которая принимает в качестве входных данных процедуру, которая вычисляет f и положительное целое число n, и возвращает процедуру, которая вычисляет n-е повторное применение f. Ваша процедура должна использоваться следующим образом:

((repeated square 2) 5)
625

Вы можете использовать это, чтобы упростить ответ:

 (define (compose f g) (lambda (x) (f (g x))))

Ответы [ 2 ]

2 голосов
/ 05 мая 2009
(define (repeated f n)
  (if (= n 1)
      f
      (compose f (repeated f (- n 1)))))
1 голос
/ 30 октября 2008

Вы только что удалили и задали этот вопрос? Я копирую свой предыдущий ответ здесь (к счастью, мой браузер кэшировал его):

Ну, вы, наверное, хотите что-то подобное, верно?

((repeated square 3) 5)
-> (square ((repeated square 2) 5))
-> (square (square ((repeated square 1) 5)))
-> (square (square (square ((repeated square 0) 5))))
-> (square (square (square (identity 5))))

(Я не знаю, предопределена ли идентичность в Схеме. Если нет, то ее легко написать.)

Теперь, это не может быть воспроизведено напрямую, потому что вы не можете волшебным образом заключить код вне вызова повторения с произвольным материалом. Однако как эти шаги сокращения выглядят при переписывании с использованием compose? Можете ли вы выделить шаблон в результирующем списке шагов и воспроизвести его?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...