0
0

More than 3 years have passed since last update.

Goの演習「Exercise: Loops and Functions」をやってみた

Last updated at Posted at 2021-05-27

課題との出会い

GOのチュートリアルを進めていたら突如として課題が出てきました。
それがこちら
スクリーンショット 2021-05-27 23.15.31.png

URL:https://go-tour-jp.appspot.com/flowcontrol/8

どうやら引数にある数値の平方根に近づけてみよ!とのこと
ニュートン法に関してはよくわからないのでスルーします。

実際にやってみた

package main

import (
    "fmt"
    "math"
)

// 引数の平方根に近づける
func Sqrt(x float64) float64 {
    z := 1.0

    // 10回繰り返すことが要件となっている
    for i:=1; i<=10; i++ {

        // 記載通りの計算式
        z -= (z*z - x) / (2*z)

        count := i  
        countString := "回目の結果"
        result := z
        fmt.Println(count , countString , result)

        // 実際の平方根と同じになれば抜ける
        if math.Sqrt(x) == z {
            fmt.Println("clear!")
            break;
        }

    }

    return z
}

func main() {
    var num float64 = 2 // 別の数値を試したい時はここを変更する
    result := Sqrt(num) 
    fmt.Println(result)
    fmt.Println(math.Sqrt(num))
}

まず上から

package main

import (
    "fmt"
    "math"
)

fmtパッケージを使うことで整形されたI/Oを使うことができます。
mathパッケージには数式に関する関数が詰まってます。

お次はこちら

// 引数の平方根に近づける
func Sqrt(x float64) float64 {
    z := 1.0

    // 10回繰り返すことが要件となっている
    for i:=1; i<=10; i++ {

        // 記載通りの計算式
        z -= (z*z - x) / (2*z)

        count := i  
        countString := "回目の結果"
        result := z

        fmt.Println(count , countString , result)
        // 実際の平方根と同じになれば抜ける
        if math.Sqrt(x) == z {
            fmt.Println("clear!")
            break;
        }
    }

    return z
}

z := 1.0にすることで浮動小数点数にする
z -= (z*z - x) / (2*z)は問題文にある計算式

    count := i  
    countString := "回目の結果"
    result := z
     fmt.Println(count , countString , result)
        // 実際の平方根と同じになれば抜ける
        if math.Sqrt(x) == z {
            fmt.Println("clear!")
            break;
        }

まずは結果を返してます。
先程のmathパッケージを使用してSqrtという引数の平方根を返してくれる関数を使います。
xの平方根とzが一致すればループから抜けることになります。抜けたことがわかりやすく clear!も入れときます。
最後に条件分岐というのもおかしな書き方かと思ってます・・・w

func main() {
    var num float64 = 2 // 別の数値を試したい時はここを変更する
    result := Sqrt(num) 
    fmt.Println(result)
    fmt.Println(math.Sqrt(num))

}

こちらに関しては特に追加で実装する必要はないのですが、良い感じにしてみました。
必要に応じてnumを変更して実行するのも面白いよね!っていう意図で実装しました。

出力結果

下記のようになりました。

1 回目の結果 1.5
2 回目の結果 1.4166666666666667
3 回目の結果 1.4142156862745099
4 回目の結果 1.4142135623746899
5 回目の結果 1.4142135623730951
clear!
1.4142135623730951
1.4142135623730951

ググった感じ、結果に大きな違いはないかと思うのでクリアとしてます!w

良い書き方等があれば教えていただけると幸いです・・・!

参考文献

https://xn--go-hh0g6u.com/pkg/fmt/
https://xn--go-hh0g6u.com/pkg/math/
https://xn--go-hh0g6u.com/pkg/math/#Sqrt

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0