Как бы я мог более четко выразить эту функцию схемы?

(define (repeated f n)
   if (= n 0)
   f
   ((compose repeated f) (lambda (x) (- n 1))))

Я написал эту функцию, но как бы я выразил это более четко, используя простую рекурсию с повторением?

Извините, я забыл определить свою функцию создания.

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

И функция принимает в качестве входных данных процедуру, которая вычисляет f и положительное целое число n, и возвращает процедуру, которая вычисляет n-е повторное применение f.


person Community    schedule 10.11.2008    source источник
comment
Вы тестировали эту функцию? Делает ли он в настоящее время то, что, по вашему мнению, должен?   -  person Hugh Allen    schedule 10.11.2008
comment
Извините, что недостаточно ясно выразился, я обновил свой пост.   -  person    schedule 10.11.2008


Ответы (3)


Я предполагаю, что (повторное f 3) должно возвращать функцию g(x)=f(f(f(x))). Если это не то, что вы хотите, пожалуйста, уточните. В любом случае, это определение повторения можно записать следующим образом:

(define (repeated f n)
  (lambda (x)
    (if (= n 0)
        x
        ((repeated f (- n 1)) (f x))))) 

(define (square x)
  (* x x))

(define y (repeated square 3))

(y 2) ; returns 256, which is (square (square (square 2)))
person Kyle Cronin    schedule 10.11.2008

(define (repeated f n)
  (lambda (x)
    (let recur ((x x) (n n))
      (if (= n 0)
          args
          (recur (f x) (sub1 n))))))

Напишите функцию, как обычно, за исключением того, что аргументы передаются в два этапа. Было бы еще понятнее определить repeated таким образом:

(define repeated (lambda (f n) (lambda (x) 
  (define (recur x n)
    (if (= n 0)
        x
        (recur (f x) (sub1 n))))
  (recur x n))))

Вам не нужно использовать 'let-loop' таким образом, и лямбда-выражения делают очевидным, что вы ожидаете свои аргументы в два этапа. (Примечание: recur не встроен в Scheme, как в Clojure, мне просто нравится название)

> (define foonly (repeat sub1 10))
> (foonly 11)
1
> (foonly 9)
-1

Крутая функциональная функция, которую вы хотите здесь, — это каррирование, а не композиция. Вот Haskell с неявным каррированием:

repeated _ 0 x = x
repeated f n x = repeated f (pred n) (f x)

Надеюсь, это не проблема с домашним заданием.

person Nathan Shively-Sanders    schedule 10.11.2008

Что пытается сделать ваша функция просто из любопытства? Это запустить f, n раз? Если это так, вы можете сделать это.

(define (repeated f n)
  (for-each (lambda (i) (f)) (iota n)))
person Chris Jester-Young    schedule 10.11.2008