函数直接或间接调用函数本身,则该函数称为递归函数。
使用递归函数时经常会遇到的一个重要问题就是栈溢出:一般出现在大量的递归调用导致的内存分配耗尽。有时我们可以通过循环来解决:
package main
import "fmt"
// Factorial函数递归调用
func Factorial(n uint64)(result uint64) {
if (n > 0) {
result = n * Factorial(n-1)
return result
}
return 1
}
// Fac2函数循环计算
func Fac2(n uint64) (result uint64) {
result = 1
var un uint64 = 1
for i := un; i <= n; i++ {
result *= i
}
return
}
func main() {
var i uint64= 7
fmt.Printf("%d 的阶乘是 %d\n", i, Factorial(i))
fmt.Printf("%d 的阶乘是 %d\n", i, Fac2(i))
}
程序输出:
7 的阶乘是 5040
7 的阶乘是 5040
Go 语言中也可以使用相互调用的递归函数:多个函数之间相互调用形成闭环。因为 Go 语言编译器的特殊性,这些函数的声明顺序可以是任意的。
Go语言中函数可以作为其它函数的参数进行传递,然后在其它函数内调用执行,一般称之为回调。
package main
import (
"fmt"
)
func main() {
callback(1, Add)
}
func Add(a, b int) {
fmt.Printf("%d 与 %d 相加的和是: %d\n", a, b, a+b)
}
func callback(y int, f func(int, int)) {
f(y, 2) // 回调函数f
}
程序输出:
1 与 2 相加的和是: 3
下一节:函数值字面量是一种表达式,它的值被称为匿名函数。