编程中的嵌套函数

Nested function in programing

我正在看牛顿的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-iter”的主体中,“sqrt iter”应该放在“sqrt x”的主体中

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

为什么它不像 that.I 我在使用 LISP

注意 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 中定义 good-enough?improve,但也许他们在书中写的方式更清楚.这是有效的,但缺点是每次调用 sqrt-iter 时都会重新定义 good-enough?improve

(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))

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