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

这是一个用于 sqrt 的程序。问题是当您尝试使用 new-if 将 if 替换为 new-if 时会发生什么。

(define (sqrt-iter guess x)
    (if (good-enough? guess x)
        guess
        (sqrt-iter(improve guess x)
                  x)))

这是新的,如果

 (define (new-if predicate then-clause else-clause)
      (cond (predicate then-clause)
            (else else-clause)))

我的意见是两个程序的结果是一样的。因为 new-if 和 if 可以产生相同的结果。

但是,new-if 被证明是错误的,因为当我尝试时它是一个死循环。

所以为什么?

4

3 回答 3

9

new-if是一个函数。函数的所有参数都在调用函数之前进行评估。但是sqrt-iter是一个递归函数,你需要避免在参数已经足够好的情况下进行递归调用。

内置ifis 语法,并且仅根据条件的值评估 then-branch 或 else-branch。

您可以使用宏来编写new-if.

于 2012-09-17T04:35:44.037 回答
3

这是演示代数步进器的完美示例!在代数步进器中,您可以看到计算过程与您的预期有何不同。在这里,您必须注意例如 (new-if 1 2 3) 和 (if 1 2 3) 的评估差异。

如果您之前没有尝试过代数步进器,请查看此答案以了解它的外观。

于 2012-09-17T09:43:28.690 回答
0

new-if由于球拍是一个应用程序,因此is的第三个参数(sqrt-iter(improve guess x) x))。由于sqrt-iter是递归的,因此第三个参数永远不会分配给它的值。因此,您永远不会进入new-if评估函数的过程。

于 2019-08-03T23:14:38.797 回答