I\'m just beginning to work through SICP (on my own; this isn\'t for a class), and I\'ve been struggling with Exercise 1.6 for a couple of days and I just can\'t seem to figure
Previous answers are great. I'll add another one that explains in a more thorough way.
Another way to think of this difference is like this: How is the recursion using if stopping at some point and the one using new-if looping forever?
First lets see how these two ifs work in general and then how they work for this case.
ifThis is explained by @alex-vasi:
To evaluate an if expression, the interpreter starts by evaluating the
part of the expression. If theevaluates to a true value, the interpreter then evaluates theand returns its value. Otherwise it evaluates theand returns its value.
new-ifThis is explained by @Schmudde:
All arguments are fully evaluated before the procedure is called.
if stopping at some point?It's stopping because at the point where the guess is good enough (ie (good-enough? guess x) is true), we will have:
(if (good-enough? guess x)
guess
(sqrt-iter (improve guess x)
x)))
And since the predicate is now true, the interpreter will evaluate the consequent (which is guess), return its value and will no longer evaluate the alternative (which is (sqrt-iter (improve guess x) x)).
So if actually evaluates (sqrt-iter (improve guess x) x) recursively up until the guess is good enough. Then it stops the recursion.
new-if looping forever?As with if, with new-if (sqrt-iter (improve guess x) x) will be evaluated recursively up until the guess is good enough.
But then it will keep evaluating (sqrt-iter (improve guess x) x) again and again. Why? Because when evaluating:
(new-if (good-enough? guess x)
guess
(sqrt-iter (improve guess x)
x)))
since new-if is a procedure, it will not check if (good-enough? guess x) is true or not in order to decide to evaluate either guess or (sqrt-iter (improve guess x)). What it will do is that it will evaluate (good-enough? guess x), guess and (sqrt-iter (improve guess x)) because those are the arguments of the procedure. So even when guess is good enough it will keep calling (sqrt-iter (improve guess x)) recursively :/.