[x/tour] tour: make Sqrt exercise more accessible

Also don't assume prior knowledge of switch statement,
which I noticed right below the Sqrt exercise.

Change-Id: I1f3e191aa924a79c822780353a526d8edaafc168
Reviewed-on: https://go-review.googlesource.com/72130
Reviewed-by: Austin Clements <austin@google.com>
X-Tour-Commit: 65fff99b2f877724f97e10c96175e2a2bef5be86
This commit is contained in:
Russ Cox 2017-10-20 10:33:10 -04:00
Родитель 6c97193385
Коммит 89c3a251f8
2 изменённых файлов: 33 добавлений и 11 удалений

Просмотреть файл

@ -73,32 +73,54 @@ in `main` begins.)
* Exercise: Loops and Functions
As a way to play with functions and loops, implement the square root function using Newton's method.
As a way to play with functions and loops, let's implement a square root function: given a number x, we want to find the number z for which z² is most nearly x.
Newton's method is to approximate `Sqrt(x)` by picking a starting point _z_ first, and repeating:
.image /content/img/newton.png
Hint: Iterate and return the final value of _z_ as the answer:
Computers typically compute the square root of x using a loop.
Starting with some guess z, we can adjust z based on how close z² is to x,
producing a better guess:
z -= (z*z - x) / (2*z)
To begin with, repeat the calculation 10 times and see how close you get to the answer for various values (1, 2, 3, ...).
Repeating this adjustment makes the guess better and better
until we reach an answer that is as close to the actual square root as can be.
Next, change the loop condition to stop once the value has stopped changing (or only changes by a very small amount). See if that's more or fewer than 10 iterations. How close are you to the [[https://golang.org/pkg/math/#Sqrt][math.Sqrt]]?
Implement this in the `func`Sqrt` provided.
A decent starting guess for z is 1, no matter what the input.
To begin with, repeat the calculation 10 times and print each z along the way.
See how close you get to the answer for various values of x (1, 2, 3, ...)
and how quickly the guess improves.
Hint: To declare and initialize a floating point value, give it floating point syntax or use a conversion:
Hint: To declare and initialize a floating point value,
give it floating point syntax or use a conversion:
z := 1.0
z := float64(1)
Next, change the loop condition to stop once the value has stopped
changing (or only changes by a very small amount).
See if that's more or fewer than 10 iterations.
Try other initial guesses for z, like x, or x/2.
How close are your function's results to the [[https://golang.org/pkg/math/#Sqrt][math.Sqrt]] in the standard library?
(Note: If you are interested in the details of the algorithm, the z² x above
is how far away z² is from where it needs to be (x), and the division by 2z is the derivative
of z², to scale how much we adjust z by how quickly z² is changing.
This general approach is called [[https://en.wikipedia.org/wiki/Newton%27s_method][Newton's method]].
It works well for many functions but especially well for square root.)
.play flowcontrol/exercise-loops-and-functions.go
* Switch
You probably knew what `switch` was going to look like.
A `switch` statement is a shorter way to write a sequence of `if`-`else` statements.
It runs the first case whose value is equal to the condition expression.
A case body breaks automatically, unless it ends with a `fallthrough` statement.
Go's switch is like the one in C, C++, Java, JavaScript, and PHP,
except that Go only runs the selected case, not all the cases that follow.
In effect, the `break` statement that is needed at the end of each case in those
languages is provided automatically in Go.
Another important difference is that Go's switch cases need not
be constants, and the values involved need not be integers.
.play flowcontrol/switch.go

Двоичные данные
tour/content/img/newton.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 790 B