I'm new in programming and started learning the language Scheme. (I study on the book Structure and Interpretation of Computer Programs) and there came across one task which is described below. I wrote two codes replacing if
with cond
, but for some reason when running the first code there is endless recursion, but when running the second code there is no endless recursion and it normally calculates sqrt...although the code is the same, why is that?
Alyssa P. Hacker doesn’t see why
if
needs to be provided as a special form. “Why can’t I just define it as an ordinary procedure in terms ofcond
?” she asks. Alyssa’s friend Eva Lu Ator claims this can indeed be done, and she defines a new version ofif
:
(define (new-if predicate then-clause else-clause)
(cond (predicate then-clause)
(else else-clause)))
Eva demonstrates the program for Alyssa:
(new-if (= 2 3) 0 5)
5
(new-if (= 1 1) 0 5)
0
Delighted, Alyssa uses
new-if
to rewrite thesquare-root
program:
(define (sqrt-iter guess x)
(new-if (good-enough? guess x)
guess
(sqrt-iter (improve guess x)
x)))
What happens when Alyssa attempts to use this to compute square roots? Explain.
First Code:
(define (new-if predicate then-clause else-clause)
(cond (predicate then-clause)
(else else-clause)))
(define (square x)
(* x x))
(define (average x y)
(/ (+ x y) 2))
(define (improve guess x)
(average guess (/ x guess)))
(define (better-good-enough? prev-guess guess)
(< (abs (- guess prev-guess))
0.00001))
(define (better-sqrt-iter prev-guess guess x)
(new-if (better-good-enough? prev-guess guess)
guess
(better-sqrt-iter guess
(improve guess x)
x)))
(define (better-sqrt x)
(better-sqrt-iter 0 1.0 x))
Second Code:
(define (square x)
(* x x))
(define (average x y)
(/ (+ x y) 2))
(define (improve guess x)
(average guess (/ x guess)))
(define (better-good-enough? prev-guess guess)
(< (abs (- guess prev-guess))
0.00001))
(define (better-sqrt-iter prev-guess guess x)
(cond ((better-good-enough? prev-guess guess)
guess)
(else (better-sqrt-iter guess
(improve guess x)
x))))
(define (better-sqrt x)
(better-sqrt-iter 0 1.0 x))