【问题标题】: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
    

    【讨论】:

    • emmm~我觉得很复杂,开始版是这个~谢谢`
    【解决方案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 中的解决方案。 (此处留作比较)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-30
      • 1970-01-01
      • 2017-01-21
      • 2019-07-05
      • 2020-01-23
      • 2011-08-02
      相关资源
      最近更新 更多