;; repeated

(define (repeated n f)
  (lambda (x)
    (if (zero? n)
        x
        ((repeated (- n 1) f)(f x)))))

((repeated 3 (lambda (x)
               (* x 3))) 3)
; -> 81

((repeated 3 (cut * <> 3)) 3)
; -> 81


(define (repeated n f)
  (lambda (x)
    (letrec ((rep (lambda (n acc)
                    (if (zero? n)
                        (acc x)
                        (rep (- n 1)
                             (lambda (y)
                               (f (acc y))))))))
      (rep n identity))))

((repeated 5 (cut * <> 2)) 2)
; -> 64


(define (repeated n f)
  (lambda (x)
    (let loop ((n n)
               (acc identity))
      (if (zero? n)
          (acc x)
          (loop (- n 1)
                (lambda (y)
                  (f (acc y))))))))

((repeated 5 (cut * <> 2)) 2)
; -> 64