编程中的嵌套函数
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 中定义和使用过程的部分,您似乎混淆了概念,混淆了参数、过程定义和过程调用。
我正在看牛顿的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 中定义和使用过程的部分,您似乎混淆了概念,混淆了参数、过程定义和过程调用。