📘

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

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://go言語.com/pkg/fmt/
https://go言語.com/pkg/math/
https://go言語.com/pkg/math/#Sqrt

Discussion