Golang 第五章 2.递归
递归是指 函数直接或间接调用自身。
Go 允许函数递归调用,并且与循环一样可以完成重复操作。
示例:阶乘函数
func factorial(n int) int {
if n == 0 {
return 1
}
return n * factorial(n-1)
}当 n == 0 时停止递归(基准情况)
否则函数调用自身 factorial(n-1)
调用:
fmt.Println(factorial(5)) // 120示例:斐波那契数列
func factorial(n int) int {
if n == 0 {
return 1
}
return n * factorial(n-1)
}调用:
for i := 0; i < 10; i++ {
fmt.Println(fibonacci(i))
}输出:
0 1 1 2 3 5 8 13 21 34递归注意事项
必须有基准条件:避免无限递归 导致栈溢出(stack overflow)
递归可能效率低:重复计算多次 可考虑用循环或缓存优化(动态规划)
递归与切片结合示例
递归处理列表或树结构很常用:
func sum(s []int) int {
if len(s) == 0 {
return 0
}
return s[0] + sum(s[1:])
}
fmt.Println(sum([]int{1,2,3,4,5})) // 15每次取切片首元素
剩余部分递归求和
递归与 map
递归也常用于处理嵌套 map 或 JSON:
func printMap(m map[string]interface{}) {
for k, v := range m {
switch val := v.(type) {
case map[string]interface{}:
printMap(val) // 递归
default:
fmt.Println(k, val)
}
}
}遇到嵌套 map 时调用自身
支持任意深度 JSON 解析



评论