如何重复一个函数调用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
我正在尝试使用名为 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