Golang 第五章 2.递归

  • By v2ray节点

  • 2026-03-26 16:36:45

  • 评论

递归是指 函数直接或间接调用自身

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 解析


v2ray节点购买