我如何更清楚地表达这个Scheme函数?

时间:2008-11-10 00:52:19

标签: lisp scheme

(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的过程作为输入,并返回计算f的第n次重复应用的过程。

3 个答案:

答案 0 :(得分:1)

我假设(重复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)))

答案 1 :(得分:1)

(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',而lambdas显然你希望你的论证分两个阶段。 (注意:recur不是内置于Scheme中,因为它在Clojure中,我就像这个名字一样)

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

你想要的很酷的功能是currying,而不是构图。这是带有隐含currying的Haskell:

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

我希望这不是一个家庭作业问题。

答案 2 :(得分:0)

你的功能试图做什么,只是出于好奇?它要运行fn次吗?如果是这样,你可以这样做。

(define (repeated f n)
  (for-each (lambda (i) (f)) (iota n)))