Jer*_*hao 4 lisp scheme sicp racket
(define (sqrt-iter guess x)
(if (good-enough? guess x)
guess
(sqrt-iter(improve guess x)
x)))
(define (improve guess x)
(average guess(/ x guess)))
(define (average x y)
(/ (+ x y) 2))
(define (good-enough? guess x)
(< (abs (- (square guess) x)) 0.0001))
(define (square x)
(* x x))
(define (sqrt-g x)
(sqrt-iter 1.0 x))
Run Code Online (Sandbox Code Playgroud)
这是sqrt的一个程序.问题是当你尝试使用new-if替换if-if时会发生什么.
(define (sqrt-iter guess x)
(if (good-enough? guess x)
guess
(sqrt-iter(improve guess x)
x)))
Run Code Online (Sandbox Code Playgroud)
这是新的,如果
(define (new-if predicate then-clause else-clause)
(cond (predicate then-clause)
(else else-clause)))
Run Code Online (Sandbox Code Playgroud)
我的观点是两个程序的结果是一样的.因为new-if和if可以产生相同的结果.
然而,新的 - 如果证明是错误的,因为当我尝试时它是一个死圈.
所以为什么?
new-if是一个功能.在调用函数之前,将评估函数的所有参数.但是sqrt-iter是一个递归函数,当参数已经足够好时,你需要避免进行递归调用.
内置if语法,仅根据条件的值计算then-branch或else-branch.
您可以使用宏来编写new-if.