sicp 1.44为什么它是#<procedure>

时间:2018-01-13 12:33:14

标签: iteration scheme sicp function-composition

#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>

我错过了什么?

2 个答案:

答案 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中的解决方案。 (留待此处进行比较)。