演習:ループと関数
関数とループを使って遊ぶ方法として、平方根関数を実装してみましょう:数 x が与えられたとき、z² が x に最も近い z の値を見つけたいと思います。
コンピュータは通常、ループを使用して x の平方根を計算します。最初にいくつかの推測 z から始め、z² が x にどれだけ近いかに基づいて z を調整し、より良い推測を生成します:
z -= (z*z - x) / (2*z)
この調整を繰り返すことで、推測はどんどん良くなり、実際の平方根にできるだけ近い答えに達します。
提供された func Sqrt
にこれを実装してください。z の適切な初期推測は 1 で、入力が何であれ同じです。まず、計算を 10 回繰り返し、その過程で各 z を印刷します。さまざまな x の値(1、2、3、…)に対して、どれだけ答えに近づくか、また推測がどれだけ早く改善されるかを確認してください。
ヒント:浮動小数点値を宣言して初期化するには、浮動小数点構文を使用するか、変換を行います:
z := 1.0
z := float64(1)
次に、値が変化しなくなるまで(または非常に小さな変化しかない場合)ループ条件を変更します。それが 10 回の反復よりも多いか少ないかを確認してください。z の他の初期推測、例えば x や x/2 を試してみてください。あなたの関数の結果は、標準ライブラリの math.Sqrt にどれだけ近いですか?
(注: アルゴリズムの詳細に興味がある場合、上記の z² − x は z² が必要な場所(x)からどれだけ離れているかを示し、2z での除算は z² の導関数であり、z² がどれだけ変化しているかに応じて z をどれだけ調整するかをスケールします。この一般的なアプローチは ニュートン法 と呼ばれ、多くの関数に対してうまく機能しますが、特に平方根に対してうまく機能します。)
package main
import (
"fmt"
)
func Sqrt(x float64) float64 {
}
func main() {
fmt.Println(Sqrt(2))
}