ゼロから学ぶGo言語プログラミング(7) A Tour of Go 17~24
A Tour of Goの続き。 制御構造からです。
17.For
- Golangの繰り返しはwhileなしのforのみ
- 初期化や条件に()なし
- {}は必須
18.For continued
for ; sum < 1000; {
セミコロンありで処理なしってのは分かりにくいような。
19.For is Go's "while"
ということで、
for sum < 1000 {
とすればwhile相当に。
20.Forever
空条件でシンプルに無限ループ。
抜けるのはbreakとか?
21.If
ifもfor同様、()なしで{}必須。 自分の好みに合ってて良い。
しかし、returnがバカスカ出てくるイメージだなあ。
22.If with a short statement
Goのifは初期化が可能であり、初期化と条件は;で区切る。
初期化での宣言はそのifのみで有効。 つまりifはスコープを持つ。
23.If and else
スコープがelseでも共通ということは、確かに色んな処理をifで分かりやすく書きやすそう。
24.Exercise: Loops and Functions
課題はニュートン法を実装しなさい、というもの。 でもこの手の数学がろくに身についていない。
取り敢えず、提示してくれている数式をベタにコードにするところから始めて、自分で精度を指定したものと、math.Sqrt()の結果と一致するまでのものとを作り分けたり、複数の戻り値を使って回数も返すようにしたりした結果、以下のコードになった。
package main import ( "fmt" "math" ) func SqrtA(x float64) (float64, int) { const a = 0.00000000000000001 z := float64(1) i := 1 for t := float64(0); math.Abs(t-z) > a; i++ { t = z z = z - (((z * z) - x) / (x * x)) } return z, i } func SqrtB(x float64) (float64, int) { z := float64(1) m := math.Sqrt(x) i := 1 for ; m != z; i++ { z = z - (((z * z) - x) / (x * x)) } return z, i } func main() { n := 6.0 fmt.Println(math.Sqrt(n)) fmt.Println(SqrtA(n)) fmt.Println(SqrtB(n)) }
ひとまず目的の算出はできているけれど、肝心の算出部分がひどく不格好な式になってる。 golangもだけれど、数学とコンピューティングの基礎を積み上げないと難しそう。
しかし、やはり課題をひとつ解いてみるだけで、もやっとしていた概念の理解が明確になる。
制御構造は一旦終わりで、続きは型周りらしい。