Go の関数は再帰呼び出しをサポートしている。よくある階乗を求めるプログラムを見てみよう。
package main
import "fmt"
func fact(n int) int {
if n == 0 {
return 1
} else {
return n * fact(n - 1)
}
}
func main() {
for i := 0; i < 13; i++ {
fmt.Println(i, ":", fact(i))
}
}
^o^ > go run fact.go 0 : 1 1 : 1 2 : 2 3 : 6 4 : 24 5 : 120 6 : 720 7 : 5040 8 : 40320 9 : 362880 10 : 3628800 11 : 39916800 12 : 479001600
func で定義した関数でなく匿名関数でも、先に関数を代入する変数を宣言しておけば、再帰呼び出しができる。
package main
import "fmt"
func main() {
var fact func(int) int
fact = func(n int) int {
if n == 0 {
return 1
} else {
return n * fact(n - 1)
}
}
for i := 0; i < 13; i++ {
fmt.Println(i, ":", fact(i))
}
}
^o^ > go run fact2.go 0 : 1 1 : 1 2 : 2 3 : 6 4 : 24 5 : 120 6 : 720 7 : 5040 8 : 40320 9 : 362880 10 : 3628800 11 : 39916800 12 : 479001600
匿名関数については、また改めて書く。