Golang初心者&Qiita投稿練習を兼ねて。
A Tour of Goやってみたら突然練習問題が
(URL)https://go-tour-jp.appspot.com/flowcontrol/8
ニュートン砲?!
何ソレ強そう・・・
z -= (z*z - x) / (2 * z)
うーん、わからん。
気になるが、調べ始めたら深みに嵌りそうなので無理解なまま計算式をコピってぺして終了。
理解しておけばこの先役立つかもしれないが。
元々要領の悪い自分は優先順位と時間配分も学ばねばならぬ。
これも訓練の一環と考え、計算式の意味はわからないままでヨシとする。
調べるな〜 調べるな〜 (BGM: The 黄色い猿 )
<説明コメント過剰気味?なコード>
そうして出来上がったプログラムがコチラ。
hey2ho.go
package main
import (
"fmt"
"math"
)
//ニュートン法を用いて平方根の近似値を求める
func Sqrt(x float64) float64 {
z := float64(1) //2乗して入力値xに近付ける
var s float64 //z^2がxにどれくらい近付いたかの比較用
//最大でも試行10回までとする
for i := 1; i <= 10; i++ {
//ニュートン法(とりあえず理解できなくてもOKとする)
z -= (z*z - x) / (2 * z)
//%fだと精度(表示桁数)が足りないので%g(計算結果には影響しない)
fmt.Printf("%d回目: %g 差分: %g\n", i, z, math.Abs(z-s))
//差分が0.0000000001を下回ったら最終的な解とする
if math.Abs(z-s) < 1e-10 { //1e-1=0.1
/* 上記if文の別バージョン
本家のmath.Sqrt()と同じ値になったら抜ける
if math.Sqrt(x) == z { */
break
}
//1つ前の値との差分を比較する
s = z
}
return z
}
func main() {
fmt.Println(Sqrt(2))
fmt.Println("一夜一夜に人見頃")
fmt.Println(Sqrt(3))
fmt.Println("人並みに奢れや")
}
<実行結果>
$ go run hey2ho.go
1回目: 1.5 差分: 1.5
2回目: 1.4166666666666667 差分: 0.08333333333333326
3回目: 1.4142156862745099 差分: 0.002450980392156854
4回目: 1.4142135623746899 差分: 2.123899820016817e-06
5回目: 1.4142135623730951 差分: 1.5947243525715749e-12
1.4142135623730951
一夜一夜に人見頃
1回目: 2 差分: 2
2回目: 1.75 差分: 0.25
3回目: 1.7321428571428572 差分: 0.017857142857142794
4回目: 1.7320508100147276 差分: 9.204712812960203e-05
5回目: 1.7320508075688772 差分: 2.445850411092465e-09
1.7320508075688772
人並みに奢れや
ニュートン法
に関しては1㍉も理解しないまま目的は達成できた模様。
今はこれでよしとしよう。
<おわりに>
3年ほど前にも自分の知識定着を兼ねてQiita記事を幾つか書いてみたものの
- あまりにも学習進度が遅い
- 要領が悪いのであれこれ分散せず集中した方がよさげ
- 投稿に費やす時間もっとコード書いた方がよいのでは…?
- Markdown記法に慣れる前にプログラミング言語の理解を深めるべき
- 既に先人が遺した優れた内容を焼き増しても「資産」にはならない
- むしろネットの海に邪魔なデブリを増やしかねない
- 「不特定多数からどう見られるか?」を気にしてる自分がなんかヤダ
- 頑張ってますアピールしたいのか?と自己信頼が下がる
などの理由により、投稿に時間をかけるのはやめた。
実際知識や技術レベルが低いうちは低質な記事を時間をかけて量産するより、その分もくもくとコード書いた方がいい気がしないでもない。試行錯誤中。
たった一つの正解はなく、いろんな考え方や人によって向き不向き・段階があると思う。
いろいろやってみて、合わないと思ったら捨てることも必要だなと。