Go语言的递归函数

一、什么是递归函数?

递归函数

函数在自己的函数体中 调用自己

递归 =

  • 当前问题 拆成

  • 更小规模的同类问题

  • 直到一个 终止条件(base case)

少了终止条件,程序就会「无限套娃」直接栈溢出 。

二、Go 递归函数的基本结构

Go 中递归函数 和普通函数写法完全一样,没有任何特殊语法。

Go 复制代码
func f(...) 返回值 {
    // 1. 终止条件
    if 条件 {
        return 某个值
    }

    // 2. 递归调用
    return f(更小的问题)
}

三、最经典例子:阶乘(Factorial)

数学定义

n! = n × (n-1)!

0! = 1

Go 实现

Go 复制代码
func factorial(n int) int {
    if n == 0 {
        return 1 // 终止条件
    }
    return n * factorial(n-1)
}

调用

Go 复制代码
fmt.Println(factorial(5)) // 120

四、递归一定要有的 2 个要素

1. 终止条件(base case)

Go 复制代码
if n == 0 {
    return 1
}

否则会导致栈溢出

2. 规模缩小

Go 复制代码
factorial(n-1)

每次调用都 更接近终止条件

五、进阶点:斐波那契数列

定义

f(0) = 0

f(1) = 1

f(n) = f(n-1) + f(n-2)

Go 实现

Go 复制代码
//1、声明
func fib(n int) int {
    if n <= 1 {
        return n
    }
    return fib(n-1) + fib(n-2)
}


//2、调用
fmt.Println(fib(6)) // 输出8

注意

这个写法在 n 大时 性能很差(重复计算)

六、递归在 Go 中的常见使用场景

1. 树 / 目录结构遍历

Go 复制代码
type Node struct {
    Val      int
    Children []*Node
}

func dfs(node *Node) {
    if node == nil {
        return
    }
    fmt.Println(node.Val)
    for _, child := range node.Children {
        dfs(child)
    }
}

2. 文件系统递归遍历

Go 复制代码
func walkDir(path string) {
    files, _ := os.ReadDir(path)
    for _, f := range files {
        fullPath := filepath.Join(path, f.Name())
        if f.IsDir() {
            walkDir(fullPath)
        } else {
            fmt.Println(fullPath)
        }
    }
}

3. 分治算法

  • 快速排序

  • 归并排序

  • 二分查找

七、递归 vs for 循环(Go 实战视角)

对比点 递归 循环
代码可读性 ⭐⭐⭐⭐ ⭐⭐⭐
写起来 简洁 稍繁琐
性能 一般 ⭐⭐⭐⭐
栈风险

Go 实战建议

  • 层级浅、逻辑清晰 用递归

  • 层级深、频繁调用 用循环或显式栈

八、Go 的一个小坑:没有尾递归优化

Go 不保证尾递归优化(不像某些函数式语言)

尾递归示例(但 Go 依然会压栈)

Go 复制代码
func sum(n, acc int) int {
    if n == 0 {
        return acc
    }
    return sum(n-1, acc+n)
}

即使是尾递归,
栈深度依然增长,大数据量要小心。

相关推荐
水坚石青2 小时前
Java+Swing+Mysql实现物业管理系统
java·开发语言·数据库·mysql·swing
尼古拉斯·纯情暖男·天真·阿玮2 小时前
[JavaEE初阶] Thread类的基本用法
java·开发语言
特立独行的猫a2 小时前
C++开发中的构建工具:现代CMake实战速成
开发语言·c++·cmake·入门教程
朝花不迟暮2 小时前
Go基础-闭包
android·开发语言·golang
Wpa.wk2 小时前
自动化测试(java) - PO模式了解
java·开发语言·python·测试工具·自动化·po模式
徐先生 @_@|||2 小时前
Java/Maven 对比 Python/PyPI
开发语言·python
编程猪猪侠2 小时前
手写js轮播图效果参考
开发语言·javascript·ecmascript
IT 行者2 小时前
Spring Security 7.0 新特性详解
java·后端·spring
思成不止于此2 小时前
C++ STL中map与set的底层实现原理深度解析
开发语言·c++·set·map·红黑树·底层实现