はじめに
Go言語の勉強version2ということで、アルゴリズムの勉強をGoでやってみたというものです。
再帰クロージャ
まず、クロージャとはなのですが、下記に参考にした文を記載致します。
Goの無名関数は「クロージャ」です。クロージャは日本語では「関数閉包」と呼ばれ、関数と関数の処理に関係する「関数外」の環境をセットにして「閉じ込めた(閉包)」ものです。
ということで、無名関数を表しています。今回はこれを使用し再帰関数を作成してみることから始めました。
- 下記に階乗を計算する関数[func fact (n int) int]を作成してみました。
fact.go
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
r := bufio.NewReader(os.Stdin)
w := bufio.NewWriter(os.Stdout)
defer w.Flush()
var a int
fmt.Fscan(r, &a)
result := solveFact(a)
fmt.Print(result)
}
func solveFact(x int) int {
var fact func(n int) int
fact = func(n int) int{
if n == 0{ return 1 }
return n * fact(n - 1)
}
return fact(x)
}
実行結果
❯ go run fact.go
4
24
- フィボナッチ数列を計算する関数[func fib (n int) int]を作成してみました。
fib.go
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
r := bufio.NewReader(os.Stdin)
w := bufio.NewWriter(os.Stdout)
defer w.Flush()
var a int
fmt.Fscan(r, &a)
result := solveFib(a)
fmt.Print(result)
}
func solveFib(x int) int {
var fib func(n int) int
fib = func(n int) int{
if n <= 1{return n}
return fib(n -1) + fib(n - 2)
}
return fib(x)
}
実行結果
❯ go run fib.go
10
55
まとめ
入出力には、fmt.Scan()/fmt.Printf()を使用しています。ただ、入出力量が怖いので、bufioを使用し、バッファリングするようにしています。