演習:ループと関数

関数とループを使って遊ぶ方法として、平方根関数を実装してみましょう:数 x が与えられたとき、z² が x に最も近い z の値を見つけたいと思います。

コンピュータは通常、ループを使用して x の平方根を計算します。最初にいくつかの推測 z から始め、z² が x にどれだけ近いかに基づいて z を調整し、より良い推測を生成します:

  1. z -= (z*z - x) / (2*z)

この調整を繰り返すことで、推測はどんどん良くなり、実際の平方根にできるだけ近い答えに達します。

提供された func Sqrt にこれを実装してください。z の適切な初期推測は 1 で、入力が何であれ同じです。まず、計算を 10 回繰り返し、その過程で各 z を印刷します。さまざまな x の値(1、2、3、…)に対して、どれだけ答えに近づくか、また推測がどれだけ早く改善されるかを確認してください。

ヒント:浮動小数点値を宣言して初期化するには、浮動小数点構文を使用するか、変換を行います:

  1. z := 1.0
  2. z := float64(1)

次に、値が変化しなくなるまで(または非常に小さな変化しかない場合)ループ条件を変更します。それが 10 回の反復よりも多いか少ないかを確認してください。z の他の初期推測、例えば x や x/2 を試してみてください。あなたの関数の結果は、標準ライブラリの math.Sqrt にどれだけ近いですか?

(注: アルゴリズムの詳細に興味がある場合、上記の z² − x は z² が必要な場所(x)からどれだけ離れているかを示し、2z での除算は z² の導関数であり、z² がどれだけ変化しているかに応じて z をどれだけ調整するかをスケールします。この一般的なアプローチは ニュートン法 と呼ばれ、多くの関数に対してうまく機能しますが、特に平方根に対してうまく機能します。)

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. func Sqrt(x float64) float64 {
  6. }
  7. func main() {
  8. fmt.Println(Sqrt(2))
  9. }