#lang planet neil/sicp
(define dx 0.00001)
(define (smooth-n f n)
(repeat smooth f n))
(define (smooth f)
(lambda (x) (/ (+ (f x) (f (- x dx)) (f (+ x dx))) 3)))
(define (compose f g)
(lambda (x) (f (g x))))
(define (repeat f g n)
(define (iter n result)
(if (< n 1)
result
(iter (- n 1) (compose f result))))
(iter n (lambda (x) (g x))))
(define (square x) (* x x))
((smooth-n square 3) 2) ---> #<procedure>
我错过了什么?
答案 0 :(得分:0)
问题在于repeat
的定义,它有一个额外的参数。在上一个练习中,需要定义一个应用于函数 f 的函数repeat
,一个正数 n 返回一个新函数,让它调用< em> fn ,将 f 应用于其参数 n 次。 repeat
然后可以定义为:
(define (repeat f n)
(if (= n 1)
f
(compose f (repeat f (- n 1)))))
或者,如果您更喜欢尾递归版本,请:
(define (repeat f n)
(define (iter n result)
(if (= n 1)
result
(iter (- n 1) (compose f result))))
(iter n f))
例如:
((repeat square 2) 2)
16
因为 fn 是计算其参数平方的平方的函数。
鉴于此定义,smooth-n
可以定义为:
(define (smooth-n f n)
((repeat smooth n) f))
即:获取应用smooth
n 次获得的函数,并将其应用于f
,以便结果为 n-fold平滑版本f 。
那样:
((smooth-n square 3) 2)
4.0000000002
答案 1 :(得分:0)
根据您的定义,我们有
((smooth-n square 3) 2)
=
((repeat smooth square 3) 2)
=
((compose smooth (compose smooth (compose smooth square))) 2)
=
(smooth (smooth (smooth (square 2))))
=
(smooth (smooth (smooth 4)))
但你想获得((smooth (smooth (smooth square))) 2)
。重新定义
(define (repeat f g n)
(define (iter n result)
(if (< n 1)
result
(iter (- n 1) (f result))))
(iter (- n 1) (f g)))
负责处理(返回4.000000000266667
)。但它确实是非惯用的;您应该使用其他answer中的解决方案。 (留待此处进行比较)。