Lesson 4
Repeated Practice Makes Perfect
Chapter 5: Breaking the flow
Newton's method (solutions)
Here are some example solutions for Newton’s method for estimating square roots.
This first solution is a more literal implementation of the given algorithm. I have chosen semantically meaningful variables such as guess
and old_guess
. I also used (guess + n/guess) * 0.5
instead of (guess + n/guess) / 2
just to show that there are different ways to implement an equation.
n = float(input("Please enter a positive number: "))
guess = n
epsilon = 0.0000001
found = False
while not found:
old_guess = guess
guess = (guess + n/guess) * 0.5
if abs(guess - old_guess) < epsilon:
found = True
print(guess)
This second solution uses a while True
loop, but with a break
statement to exit the loop. I think both are acceptable, although I personally find the first version just very slightly easier to understand than while True
.
n = float(input("Please enter a positive number: "))
guess = n
epsilon = 0.0000001
while True:
old_guess = guess
guess = (guess + n/guess) * 0.5
if abs(guess - old_guess) < epsilon:
print(guess)
break
This third solution is a very compact implementation that does not directly translate the given algorithm, but instead interprets it in a different way. Rather than checking whether the old guess and the new guess are close enough, it instead directly checks whether squaring guess
gets you close enough to n
. So, this implementation can also be seen as an improvement to the exhaustive search algorithm, but with a smarter way of selecting the candidate solutions. The result is a more concise yet still readable piece of code. No break
is needed either!
n = float(input("Please enter a positive number: "))
guess = n - 1
epsilon = 0.0000001
while abs(guess*guess - n) > epsilon:
guess = (guess + n/guess) * 0.5
print(guess)
Also, whenever you find yourself needing to use break
, try to think of whether it is really necessary? Can you ‘rephrase’ your algorithm so that it is even more readable and does not need to use break
? In general, use break
only when it makes your code more readable.
The main lesson is that there are many ways to implement a solution to the same algorithm. Some are more compact or efficient than others. The most important thing, however, is to ensure that your code works correctly. Otherwise, there is no point is having an elegant, short, or efficient piece of code.