20210109のGoに関する記事は6件です。

Goでアルゴリズムを学ぶ@再起呼び出し

Go基礎構文の理解と、アルゴリズム脳トレが目的です。

アルゴリズムについて


再起呼び出しとは


処理の中で自分自身を呼び出すことを再起呼び出しといい、その関数のことを再起関数といいます。

ユークリッドの互除法とは

2つの整数の最大公約数を求めるアルゴリズムです。手法については引用します。

入力を m, n (m ≧ n) とする。
n = 0 なら、 m を出力してアルゴリズムを終了する。
m を n で割った余りを新たに n とし、更に 元のnを新たにm とし 2. に戻る。

引用:https://ja.wikipedia.org/wiki/%E3%83%A6%E3%83%BC%E3%82%AF%E3%83%AA%E3%83%83%E3%83%89%E3%81%AE%E4%BA%92%E9%99%A4%E6%B3%95

サンプルコードその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
}

簡単に解説

ユークリッドの互除法を使用しています。

感想

重度なカフェイン中毒です。コーヒー飲まないと午後以降活動できません。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Goでアルゴリズムを学ぶ@再帰呼び出し

Go基礎構文の理解と、アルゴリズム脳トレが目的です。

アルゴリズムについて


再帰呼び出しとは


処理の中で自分自身を呼び出すことを再帰呼び出しといい、その関数のことを再帰関数といいます。

ユークリッドの互除法とは

2つの整数の最大公約数を求めるアルゴリズムです。手法については引用します。

入力を m, n (m ≧ n) とする。
n = 0 なら、 m を出力してアルゴリズムを終了する。
m を n で割った余りを新たに n とし、更に 元のnを新たにm とし 2. に戻る。

引用:https://ja.wikipedia.org/wiki/%E3%83%A6%E3%83%BC%E3%82%AF%E3%83%AA%E3%83%83%E3%83%89%E3%81%AE%E4%BA%92%E9%99%A4%E6%B3%95

サンプルコードその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
}

簡単に解説

ユークリッドの互除法を使用しています。

感想

重度なカフェイン中毒です。コーヒー飲まないと午後以降活動できません。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【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

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Golang入門1

インストールからHello world!

本文はこちら

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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
3

forの{}の中に複数の処理を書くとそれを書いた順に繰り返してくれる

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)
    }
}
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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
3

forの{}の中に複数の処理を書くとそれを書いた順に繰り返してくれる

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)
    }
}
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む