ニュートンの方法のよりエレガントなGo実装はありますか?

エレン・スペルタス:

私はGoチュートリアルを行っていますが、演習:ループと関数でこれよりもニュートンの方法を使用して平方根を計算するよりエレガントな方法があるかどうか疑問に思っています。

func Sqrt(x float64) float64 {
    count := 0
    var old_z, z float64 = 0, 1
    for ; math.Abs(z-old_z) > .001; count++ {
        old_z, z = z, z - (z*z - x) / 2*z
    }
    fmt.Printf("Ran %v iterations\n", count)
    return z
}

(仕様の一部は、反復回数を提供することです。)これは、パッケージステートメント、インポート、メインを含む完全なプログラムです。

icza:

まず、アルゴリズムが正しくありません。式は次のとおりです。

ここに画像の説明を入力してください

これを次のようにモデル化しました。

z - (z*z - x) / 2*z

ただし、次のようにする必要があります。

z - (z*z - x)/2/z

または

z - (z*z - x)/(2*z)

(あなたの間違った式には、同じように近くに取得するためにも、五十万回の繰り返しのように実行する必要がありました0.001!4回の繰り返しのような正しい式が使用する限り近くに取得する1e-6の場合x = 2)。

次に、の初期値はz=1乱数には最適はありません(のような小さな数値ではうまくいく場合があります2)。あなたはでキックオフすることができz = x / 2、非常に簡単な初期値であり、少ない工程で近い結果にあなたをとります。

必ずしも読みやすくなったりエレガントになったりしないその他のオプションは主観的なものです。

結果に名前を付けてz、returnステートメントを「ベア」にすることができます。また、ループ変数を作成して、現在の「終了」条件をループに移動すると、反復をカウントして、反復カウントを出力して単純に戻ることができるループを作成できます。計算をの初期化部分に移動することもできますif

func Sqrt(x float64) (z float64) {
    z = x / 2
    for i, old := 1, 0.0; ; i++ {
        if old, z = z, z-(z*z-x)/2/z; math.Abs(old-z) < 1e-5 {
            fmt.Printf("Ran %v iterations\n", i)
            return
        }
    }
}

z = x / 2をの初期化部分に移動することもできforますが、名前付きの結果をz作成することはできません(そうでなければ、名前付きの戻り値を隠すローカルバリアントが作成されます)。

func Sqrt(x float64) float64 {
    for i, z, old := 1, x/2, 0.0; ; i++ {
        if old, z = z, z-(z*z-x)/2/z; math.Abs(old-z) < 1e-5 {
            fmt.Printf("Ran %v iterations\n", i)
            return z
        }
    }
}

注:1私の場合の「終了」条件は内にforあり、の条件ではないため、私は反復カウンターを開始しましたfor

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

RustのRc <RefCell <T >>用のイテレータのエレガントな実装はありますか?

分類Dev

このコードよりもJavaでXMLドキュメントを文字列に変換するよりエレガントな方法はありますか?

分類Dev

よりエレガントな方法はありますか?

分類Dev

コレクションをグループ化するための単一行削減のこのハッキーな実装を回避するためのよりエレガントな方法はありますか?

分類Dev

CUDAでmallocおよびfreeするためのより良い/よりクリーンな/よりエレガントな方法はありますか?

分類Dev

関数ジャンプを完了するためのよりエレガントな実装はありますか?

分類Dev

このタイプの順列のためのよりエレガントな方法はありますか?

分類Dev

この「if」リストをよりエレガントな方法で書く方法はありますか?

分類Dev

角度のあるよりエレガントな非表示/表示パターンはありますか?

分類Dev

イベント/トリガーを定期的にチェックするためのよりエレガントな方法はありますか?

分類Dev

Rでのネストされた操作。よりエレガントな方法はありますか?

分類Dev

エコー* | xargs -n1 echo、行ごとのリストのより短く、よりエレガントな方法はありますか?

分類Dev

これらの条件を書くためのよりエレガントな方法はありますか?

分類Dev

UIImageの複数の属性に対してよりエレガントな方法はありますか?

分類Dev

UIImageの複数の属性に対してよりエレガントな方法はありますか?

分類Dev

部分文字列を作成するためのよりエレガントな方法はありますか?

分類Dev

これを書くためのより短く/エレガント/効率的な方法はありますか?

分類Dev

これらのブール式のよりエレガントな構文はありますか?

分類Dev

Pythonで辞書ループ例外を処理するためのより良いまたはよりエレガントな方法はありますか?

分類Dev

マップからリストを埋めるためのよりエレガントなソリューションはありますか?

分類Dev

この関数を実装するエレガントな方法はありますか: `(Monad m)=>(s-> a-> m(s、b))-> s-> [a]-> m [b]`

分類Dev

よりエレガントな実装を作成する方法

分類Dev

複数のORおよびANDで多対多のテーブルをクエリするよりエレガントな方法はありますか?

分類Dev

このビルダーをコーディングするためのよりエレガントな方法はありますか?

分類Dev

このLCM関数を書くためのよりクリーンでエレガントなHaskellの方法はありますか?

分類Dev

実行時にジョブ番号にアクセスするためのよりエレガントな方法はありますか?

分類Dev

Swiftでこの遅延読み込みパターンを作成するためのよりエレガントな方法はありますか?

分類Dev

フォームのデフォルト値をチェックするためのよりエレガントな方法はありますか?

分類Dev

正規表現のような数量詞を実装するためのよりエレガントな方法

Related 関連記事

  1. 1

    RustのRc <RefCell <T >>用のイテレータのエレガントな実装はありますか?

  2. 2

    このコードよりもJavaでXMLドキュメントを文字列に変換するよりエレガントな方法はありますか?

  3. 3

    よりエレガントな方法はありますか?

  4. 4

    コレクションをグループ化するための単一行削減のこのハッキーな実装を回避するためのよりエレガントな方法はありますか?

  5. 5

    CUDAでmallocおよびfreeするためのより良い/よりクリーンな/よりエレガントな方法はありますか?

  6. 6

    関数ジャンプを完了するためのよりエレガントな実装はありますか?

  7. 7

    このタイプの順列のためのよりエレガントな方法はありますか?

  8. 8

    この「if」リストをよりエレガントな方法で書く方法はありますか?

  9. 9

    角度のあるよりエレガントな非表示/表示パターンはありますか?

  10. 10

    イベント/トリガーを定期的にチェックするためのよりエレガントな方法はありますか?

  11. 11

    Rでのネストされた操作。よりエレガントな方法はありますか?

  12. 12

    エコー* | xargs -n1 echo、行ごとのリストのより短く、よりエレガントな方法はありますか?

  13. 13

    これらの条件を書くためのよりエレガントな方法はありますか?

  14. 14

    UIImageの複数の属性に対してよりエレガントな方法はありますか?

  15. 15

    UIImageの複数の属性に対してよりエレガントな方法はありますか?

  16. 16

    部分文字列を作成するためのよりエレガントな方法はありますか?

  17. 17

    これを書くためのより短く/エレガント/効率的な方法はありますか?

  18. 18

    これらのブール式のよりエレガントな構文はありますか?

  19. 19

    Pythonで辞書ループ例外を処理するためのより良いまたはよりエレガントな方法はありますか?

  20. 20

    マップからリストを埋めるためのよりエレガントなソリューションはありますか?

  21. 21

    この関数を実装するエレガントな方法はありますか: `(Monad m)=>(s-> a-> m(s、b))-> s-> [a]-> m [b]`

  22. 22

    よりエレガントな実装を作成する方法

  23. 23

    複数のORおよびANDで多対多のテーブルをクエリするよりエレガントな方法はありますか?

  24. 24

    このビルダーをコーディングするためのよりエレガントな方法はありますか?

  25. 25

    このLCM関数を書くためのよりクリーンでエレガントなHaskellの方法はありますか?

  26. 26

    実行時にジョブ番号にアクセスするためのよりエレガントな方法はありますか?

  27. 27

    Swiftでこの遅延読み込みパターンを作成するためのよりエレガントな方法はありますか?

  28. 28

    フォームのデフォルト値をチェックするためのよりエレガントな方法はありますか?

  29. 29

    正規表現のような数量詞を実装するためのよりエレガントな方法

ホットタグ

アーカイブ