Scheme 如何重复函数调用n次

Scheme 如何重复函数调用n次,scheme,Scheme,我正在尝试创建一个函数,使用名为repeat (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返回一个接受单个参数的函数f e、 g p、 美国 这与中的练习1.43相关,但不完

我正在尝试创建一个函数,使用名为
repeat

(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
返回一个接受单个参数的函数<在使用参数调用
repeat
的返回值之前,不应应用code>f

e、 g

p、 美国


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

你的定义的问题是
(lambda(x)(fx))
f
相同,即你的
重复
只重复一次

我想你需要的是

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

注意,您正在公共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))
> 
它应该做你最初想要做的事情

> (repeat2 inc 5)
#<procedure>
> ((repeat2 inc 5) 2)
7
>(重复2 inc 5)
#
>((重复2 inc 5)2)
7.

哪种语法不是通用的lisp?
(定义(重复f x)…)
应该是
(取消重复(f 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