Схема процедуры для вычисления n-го повторного применения функции? - PullRequest
1 голос
/ 30 октября 2008

Кто-нибудь знаком с этим?

Напишите процедуру, которая принимает в качестве входных данных процедура, которая вычисляет F и положительное целое число n и возвращает Процедура, которая вычисляет nth повторное применение ф. Процедура должна быть в состоянии использоваться как следующим образом:

((repeated square 2) 5)
625

Я знаю, что следующий код, который я создал для композиции функций, поможет упростить решение, но я не уверен, куда идти:

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

Ответы [ 2 ]

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))))

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

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

0 голосов
/ 05 июня 2009
(define (repeated f n)
  (if (zero? n)
    identity
    (lambda (x) ((repeated f (- n 1)) (f x)))))

или, если вы настаиваете на использовании «compose»:

(define (repeated f n)
  (if (zero? n)
    identity
    (compose (repeated f (- n 1)) f)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...