- 投稿日:2021-01-09T22:47:13+09:00
Goでアルゴリズムを学ぶ@再起呼び出し
Go基礎構文の理解と、アルゴリズム脳トレが目的です。
アルゴリズムについて
再起呼び出しとは
処理の中で自分自身を呼び出すことを再起呼び出しといい、その関数のことを再起関数といいます。ユークリッドの互除法とは
2つの整数の最大公約数を求めるアルゴリズムです。手法については引用します。
入力を m, n (m ≧ n) とする。
n = 0 なら、 m を出力してアルゴリズムを終了する。
m を n で割った余りを新たに n とし、更に 元のnを新たにm とし 2. に戻る。サンプルコードその1
ひとまずコード載せます。
package main import "fmt" func main() { num := 5 fmt.Printf("1から%dまでの総和:%d", num, calc(num)) } func calc(a int) int { if a == 0 { return 0 } result := a + calc(a-1) return result }簡単に解説
0から引数で渡した数値までの総和を計算するコードです。calc関数の中で再度calc関数を呼び出す処理をしています。
以下のように再起関数から抜ける処理は必須になります。これがないと無限ループしてしまいます。この処理はベースケースに対する処理と呼ばれています。
if a == 0 { return 0 }サンプルコードその2
ひとまずコード載せます。
package main import "fmt" func main() { //num := 5 num := [...]int{15, 51} fmt.Printf("%dと%dの最大公約数:%d", num[0], num[1], calc(num[0], num[1])) } func calc(a, b int) int { if b == 0 { return a } result := calc(b, a%b) return result }簡単に解説
ユークリッドの互除法を使用しています。
感想
重度なカフェイン中毒です。コーヒー飲まないと午後以降活動できません。
- 投稿日:2021-01-09T22:47:13+09:00
Goでアルゴリズムを学ぶ@再帰呼び出し
Go基礎構文の理解と、アルゴリズム脳トレが目的です。
アルゴリズムについて
再帰呼び出しとは
処理の中で自分自身を呼び出すことを再帰呼び出しといい、その関数のことを再帰関数といいます。ユークリッドの互除法とは
2つの整数の最大公約数を求めるアルゴリズムです。手法については引用します。
入力を m, n (m ≧ n) とする。
n = 0 なら、 m を出力してアルゴリズムを終了する。
m を n で割った余りを新たに n とし、更に 元のnを新たにm とし 2. に戻る。サンプルコードその1
ひとまずコード載せます。
package main import "fmt" func main() { num := 5 fmt.Printf("1から%dまでの総和:%d", num, calc(num)) } func calc(a int) int { if a == 0 { return 0 } result := a + calc(a-1) return result }簡単に解説
0から引数で渡した数値までの総和を計算するコードです。calc関数の中で再度calc関数を呼び出す処理をしています。
以下のように再帰関数から抜ける処理は必須になります。これがないと無限ループしてしまいます。この処理はベースケースに対する処理と呼ばれています。
if a == 0 { return 0 }サンプルコードその2
ひとまずコード載せます。
package main import "fmt" func main() { //num := 5 num := [...]int{15, 51} fmt.Printf("%dと%dの最大公約数:%d", num[0], num[1], calc(num[0], num[1])) } func calc(a, b int) int { if b == 0 { return a } result := calc(b, a%b) return result }簡単に解説
ユークリッドの互除法を使用しています。
感想
重度なカフェイン中毒です。コーヒー飲まないと午後以降活動できません。
- 投稿日:2021-01-09T20:38:38+09:00
【Go】io.Writerについて見てみる
Goのio.Writer interfaceについて調べました。
io.Writerとは
io.Writer
は以下のようなinterfaceです。type Writer interface { Write(p []byte) (n int, err error) }writeメソッドを持ちます。
色んなwriteメソッドを見かける
- ファイルの入出力
- connectionへの書き込み
- バッファへの書き込み
など色々なwriteメソッドがあります。
これは上記のwriteメソッドをfileやTCPConn,Bufferで実装しているので
それぞれのファイル
に関して書き込みが可能です。ファイルという考え方
先ほど、
ファイル
という言い回しをしましたが、ファイルディスクリプター
というものがあります。
これは、OSがカーネルのレイヤーで用意している抽象化の仕組み
です。
具体的には、数値の識別子のようなもので
- 0:標準入力
- 1:標準出力
- 2:標準エラー出力
のように数値ごとに対応するものが決まっています。
この対応するものが、ファイルだけでなくソケットなど様々なものがあります。
ただ、どれもファイルと同じようにアクセスし書き込むことができるので、
ファイルという考えで抽象化しています。
この
io.Writer
はファイルディスクリプターを模倣しGo言語で実装したようなものとなっています。参考記事
ありがとうございました。
- 低レベルアクセスへの入り口(1):io.Writer
- 投稿日:2021-01-09T00:06:20+09:00
Go言語の繰り返し処理
Goの繰り返し処理
プログラミング基本からGoの理解を文字におこして行こうと思います!
繰り返し処理
for i := 1; i <= 4; i ++ { //変数の初期化;繰り返しの条件;変数の更新 fmt.Println("Hello") } //コンソール Hello Hello Hello Hello変数iに1が代入され、「iが4以下」を満たす間{}内の処理が繰り返され
終わるたびに変数の更新「i++」が実行処理の流れ
//繰り返し処理の流れ ❶変数の初期化 ❷条件 ❸繰り返す処理 ❹変数の更新 ❷...for i := 1; i <= 5; i ++ { //❶i:=1;❷i<=5;❹i++ fmt.Println(i) //❸fmt.Println(i) } //コンソール 1 2 3 4 5繰り返しの1周目は変数iは1
forの{}の中の処理(③)が終わるたびに、変数iが更新(④)され1,2,3,4,5と変化
そしてi <= 5(②)が成立しなくなると自動的に繰り返しが終了複数の処理を繰り返す
func main() { for i := 1; i <=3; i ++ { fmt.Println("Hello") fmt.Println(i) } } //コンソール Hello 1 Hello 2 Hello 3forの{}の中に複数の処理を書くとそれを書いた順に繰り返してくれる
for文の変数定義の注意点
for var i int =1; i <= 4; i ++ { //varを用いた変数定義 fmt.Println("Hello") } //コンソール varによる変数定義はfor文では行えないとエラーfor文の変数定義では、varを使うことは出来ず
:=を用いた変数定義しか出来ない繰り返し処理を用いて、1から100の数字を出力
package main import "fmt" func main() { for i := 1; i <= 100; i ++ { fmt.Println(i) } }
- 投稿日:2021-01-09T00:06:20+09:00
Go言語-繰り返し処理
繰り返し処理
プログラミング基本からGoの理解を文字におこして行こうと思います!
繰り返し処理
for i := 1; i <= 4; i ++ { //変数の初期化;繰り返しの条件;変数の更新 fmt.Println("Hello") } //コンソール Hello Hello Hello Hello変数iに1が代入され、「iが4以下」を満たす間{}内の処理が繰り返され
終わるたびに変数の更新「i++」が実行処理の流れ
//繰り返し処理の流れ ❶変数の初期化 ❷条件 ❸繰り返す処理 ❹変数の更新 ❷...for i := 1; i <= 5; i ++ { //❶i:=1;❷i<=5;❹i++ fmt.Println(i) //❸fmt.Println(i) } //コンソール 1 2 3 4 5繰り返しの1周目は変数iは1
forの{}の中の処理(③)が終わるたびに、変数iが更新(④)され1,2,3,4,5と変化
そしてi <= 5(②)が成立しなくなると自動的に繰り返しが終了複数の処理を繰り返す
func main() { for i := 1; i <=3; i ++ { fmt.Println("Hello") fmt.Println(i) } } //コンソール Hello 1 Hello 2 Hello 3forの{}の中に複数の処理を書くとそれを書いた順に繰り返してくれる
for文の変数定義の注意点
for var i int =1; i <= 4; i ++ { //varを用いた変数定義 fmt.Println("Hello") } //コンソール varによる変数定義はfor文では行えないとエラーfor文の変数定義では、varを使うことは出来ず
:=を用いた変数定義しか出来ない繰り返し処理を用いて、1から100の数字を出力
package main import "fmt" func main() { for i := 1; i <= 100; i ++ { fmt.Println(i) } }