# SICP- Exercises 1.6 to 1.8 solutions

# Solutions: If evaluation and square roots by Newton’s Method:

**Exercise 1.6**

Alyssa P. Hacker decides to make a new version of `if`

in terms of `cond`

as a procedure. The `new-if`

seems to work for basic cases as shown by Eva, and Alyssa decides to rewrite the square-root program with `new-if`

Here is the square root procedure:

Implementing Alyssa’s version of `if`

, the `new-if`

in `sqrt-iter`

:

When Alyssa attempts to run it, since Scheme uses **Applicative order evaluation**, the interpreter will try to evaluate `sqrt-iter`

in a never ending loop because of the nature of evaluating procedures in applicative order.

What she didn’t realize is that `if`

**is not a procedure**. It is a **special form** which doesn’t act as a procedure underneath, and its conditions are checked first and then the clauses are implemented. Hence, `new-if`

won’t work the way `if`

would.

**Exercise 1.7: Improving square root approximation**

The `new-sqrt`

procedure that I mentioned above doesn’t starts failing at very large numbers, the break-point I found in my computer (with some manual binary search) was: *17738094999817*, trying any number larger than that would not work as intended. This test was also true for very small numbers (having too many zeroes after the decimal point).

The alternative checks for the change of `guess`

. If the difference of the guess and the new guess is small enough, we can consider it a good-enough guess. This is the implementation:

This seems to work perfectly fine for very large and small numbers and it easily passes the break point. Hence, we have an improvement in our `sqrt`

procedure.

**Exercise 1.8: Cube root procedure**

A rather simple exercise that asks us to implement a `cube-root`

procedure analogous to our new `sqrt`

procedure, this is based on Newton’s method for cube roots to approximate the values:

This program works well enough to calculate cube roots. No further comments.

*Dedipyaman*

Disclaimer: All the solutions and code provided above are solely based on the author's ideas and opinions and can be erroneous. There is no guarantee of the correctness and validity of the answers, views or code. Use them at your own risk. What works for me doesn't necessarily have to work for you.