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
匿名関数については、また改めて書く。