如何重复一个函数调用n次

How to repeat a function call n times

我正在尝试使用名为 repeat

的函数创建一个将自身包装 n 次的函数
(define (repeat f n)
  (if (= n 1)
      f
      (repeat (lambda (x) (f x)) (- n 1))))

((repeat inc 5) 2)

我希望结果等于

(inc (inc (inc (inc (inc 2))))) ; 7

但是我的结果是3

我做错了什么?


明确地说,我希望 repeat 到 return 接受单个参数的函数。在使用参数调用 repeat 的 return 值之前,不应应用 f

例如,

(define inc5 (repeat inc 5))
(inc5 2) ; => 7

p.s.,

这与 SICP 中的练习 1.43 相关 但不 相同。我已经解决了那里出现的问题,但我很好奇它是否也可以通过这种方式解决。

您定义的问题在于 (lambda (x) (f x))f 相同,即您的 repeat 仅重复一次。

我觉得你需要的是

(define (repeat f n)
  (if (= n 1)
      f
      (lambda (x) (f ((repeat f (- n 1)) x)))))

PS。请注意,您在 Common Lisp 标签下使用 Scheme 语法;您可能想要更新一个或另一个。

让我们看一下类似的函数。

(define (repeat-exp fn ct)
  (if (= ct 1)
      fn
      (repeat `(lambda (x) (,fn x)) (- ct 1))))

调用它会得到你

> (repeat-exp inc 5)
'(lambda (x)
   ((lambda (x)
      ((lambda (x)
         ((lambda (x) 
            ((lambda (x) 
               (#<procedure:inc> x))
             x))
          x))
       x))
    x))
> 

如您所见,您的初始函数只被调用一次;在内心的评价中。如果您希望它在每个级别都被调用,您也需要在那里调用它。

(define (repeat-exp2 fn ct)
  (if (= ct 1)
      fn
      `(lambda (x) 
         (,fn (,(repeat-exp2 fn (- ct 1)) x)))))

> (repeat-exp2 inc 5)
'(lambda (x)
   (#<procedure:inc>
    ((lambda (x)
       (#<procedure:inc>
        ((lambda (x)
           (#<procedure:inc>
            ((lambda (x)
               (#<procedure:inc> 
                (#<procedure:inc> x)))
             x)))
         x)))
     x)))
> 

现在你可以写出等价的数字了。

(define (repeat2 fn ct)
  (if (= ct 1)
      fn
      (lambda (x) 
        (fn ((repeat2 fn (- ct 1)) x)))))

最初应该做你想做的事情。

> (repeat2 inc 5)
#<procedure>
> ((repeat2 inc 5) 2)
7