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