Scheme 编程中的嵌套函数

Scheme 编程中的嵌套函数,scheme,lisp,Scheme,Lisp,我正在读牛顿在SICP中的方法,他在那里介绍了块结构,它有嵌套的函数,比如 (define (sqrt x) (define (good enough ? guess x) (<(abs(-(square guess) x)) 0.001)) (define (improve guess x) (average guess (/ x guess))) (define (sqrt-iter guess x)

我正在读牛顿在SICP中的方法,他在那里介绍了块结构,它有嵌套的函数,比如

(define (sqrt x)
    (define (good enough ? guess x)
             (<(abs(-(square guess) x)) 0.001))
    (define (improve guess x)
             (average guess (/ x guess)))
    (define (sqrt-iter guess x)
        (if (good-enough? guess x)
        guess
        (sqrt-iter(improve guess x)x))) 
(sqrt-iter 1.0 x))

(定义(sqrt x)
(定义(足够好?猜x)

(注意,
sqrt iter
的主体中已经定义了
sqrt
。但是您编写它的方式没有意义,您试图调用
sqrt iter
,但是您在调用中将其定义为第三个参数。这不对:

(sqrt-iter 1.0 x (define (sqrt-iter ...)))
您必须在调用它之前对其进行定义,并且不能将其定义为过程调用的一部分的参数。这是正确的方法:

(define (sqrt-iter guess x) ...) ; first define
(sqrt-iter 1.0 x) ; after defining, you can call it
你的另一个建议更有意义,可以在
sqrt iter
中定义
足够好吗?
改进
,但他们在书中写的方式可能更清楚。这是有效的,但缺点是
足够好吗?
改进
每次都会被重新定义
sqrt-iter
称为:

(define (sqrt x)
  (define (sqrt-iter guess x)
    (define (good-enough? guess x)
      (< (abs (- (square guess) x)) 0.001))
    (define (improve guess x)
      (average guess (/ x guess)))
    (if (good-enough? guess x)
        guess
        (sqrt-iter (improve guess x)x))) 
  (sqrt-iter 1.0 x))
(定义(sqrt x)
(定义(sqrt iter猜测x)
(定义(足够好?猜x)
(<(绝对值(-(平方猜测)x))0.001)
(定义(改进猜测x)
(平均猜测(/x猜测)))
(如果(足够好?猜x)
猜测
(sqrt iter(改进猜测x)x)))
(sqrt iter 1.0 x))

您应该更仔细地阅读本书中解释如何在Scheme中定义和使用过程的部分,您似乎混淆了概念、混合参数、过程定义和过程调用。

那么“足够好”和“改进猜测”又如何呢?可以将其置于“sqrt iter”的定义之下但不是在身体内部,为什么他不把“足够好”和“改进猜测”放在“sqrt iter”下@89085731我更新了我的答案,这些都可以移动,但我还是喜欢原版,正如书中所示——它更容易阅读。我担心的是,如果我们不把“足够好”和“改进猜测”放在“sqrt iter”下,则这两个函数位于“sqrt iter”的同一层上,但nestedit的关系与嵌套函数的关系不同,它可以被视为某种隐藏变量,因此我们需要在使用它之前调用它(不要担心嵌套;)只有这样才能在定义新过程时避免使用某些参数时才使用它。并且要注意嵌套过程的方式,定义应仅在过程的开头,而不是任意位置。
(define (sqrt x)
  (define (sqrt-iter guess x)
    (define (good-enough? guess x)
      (< (abs (- (square guess) x)) 0.001))
    (define (improve guess x)
      (average guess (/ x guess)))
    (if (good-enough? guess x)
        guess
        (sqrt-iter (improve guess x)x))) 
  (sqrt-iter 1.0 x))