【问题标题】:sicp 1.44 why it is a #<procedure>sicp 1.44 为什么它是一个#<procedure>
【发布时间】:2018-01-13 12:33:14
【问题描述】:
#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>
我错过了什么?
【问题讨论】:
标签:
iteration
scheme
sicp
function-composition
【解决方案1】:
问题出在repeat 的定义中,它有一个额外的参数。在前面的练习中,需要定义一个函数repeat 应用于函数 f 并且正数 n 返回一个新函数,我们称之为 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))
即:得到应用smoothn次得到的函数,并应用到f,这样得到的结果就是f的n倍平滑版 em>。
这样:
((smooth-n square 3) 2)
4.0000000002
【解决方案2】:
根据您的定义,我们有
((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 中的解决方案。 (此处留作比较)。