問題文はこちら
A Tour of Go
Exercise: Loops and Functions
関数とループを使った簡単な練習として、 ニュートン法 を使った平方根の計算を実装してみましょう。
この問題では、ニュートン法は、 開始点 z を選び、以下の式を繰り返すことによって、 Sqrt(x) を近似します。
z = z - (z^2-x)/2z
最初は、その計算式を10回だけ繰り返し、 x を(1, 2, 3, ...)と様々な値に対する結果がどれだけ正解値に近いかを確認してみてください。
次に、ループを回すときの直前に求めたzの値がこれ以上変化しなくなったとき (または、差がとても小さくなったとき) に停止するようにループを変更してみてください。 この変更により、ループ回数が多くなったか、少なくなったのか見てみてください。 math.Sqrt と比べてどれくらい近似できましたか?
package main
import (
"fmt"
)
func Sqrt(x float64) float64 {
}
func main() {
fmt.Println(Sqrt(2))
}
まず初めに思ったのが、なぜSqrtに投げられてるのが2なのかと・・
z,x と変数が二つあるので、main()とSqrt をすこし変更
func Sqrt(x, z float64) float64 {
}
func main() {
const x = 2
const z = 2
fmt.Println(Sqrt(x,z))
}
どうしようかなーと思ったけどrecursion(再帰)使ってみました。
import (
"fmt"
"math"
)
const delta = 1e-6
func Sqrt(x,z float64) float64 {
last_z := z - (z*z - x)/(2*z)
if math.Abs(z-last_z) < delta{
return last_z
}
return Sqrt(x, last_z)
}
問題文抜粋:ループを回すときの直前に求めたzの値がこれ以上変化しなくなったとき (または、差がとても小さくなったとき)
この値の定義が適当だったので、値の差が1e-6以下であれば十分ということにしました(どっかのぱくり)
このコード書いてから気づいたんですが、これだと10回やるという調整が効かないです。(無理ではないけど)