課題との出会い
GOのチュートリアルを進めていたら突如として課題が出てきました。
それがこちら
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