ゼロから学ぶGo言語プログラミング(7) A Tour of Go 17~24

f:id:belbo:20140616112930j:plain

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もだけれど、数学とコンピューティングの基礎を積み上げないと難しそう。

しかし、やはり課題をひとつ解いてみるだけで、もやっとしていた概念の理解が明確になる。


制御構造は一旦終わりで、続きは型周りらしい。