16.4 递归与回调

函数直接或间接调用函数本身,则该函数称为递归函数。

使用递归函数时经常会遇到的一个重要问题就是栈溢出:一般出现在大量的递归调用导致的内存分配耗尽。有时我们可以通过循环来解决:

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
下一节:函数值字面量是一种表达式,它的值被称为匿名函数。