Golang学习笔记_01——包
Golang学习笔记_02——函数
Golang学习笔记_03——匿名函数和闭包
文章目录
- 递归函数
- 1. 定义
- 2. 使用场景
- 3. 示例
- 4. 注意事项
- 源码
递归函数
在Go语言中,递归函数是一种非常重要的编程技巧,它允许函数调用其自身,这在解决某些问题时可以极大地简化代码。
1. 定义
递归函数是指在函数体内直接或间接调用自身的函数。递归函数通常有一个或多个基准条件(base case),用于终止递归调用,否则递归将无限进行下去,导致栈溢出错误。
2. 使用场景
递归函数在Go语言中常用于解决以下问题:
- 数学问题:如阶乘、斐波那契数列等。
- 数据结构遍历:如二叉树的遍历(前序、中序、后序遍历)。
- 分治算法:如快速排序、归并排序等。
3. 示例
- 阶乘
// Factorial 计算N的阶乘
func Factorial(n int) int {if n <= 1 {return 1}return n * Factorial(n-1)
}
测试方法
func TestFactorial(t *testing.T) {fmt.Println("10的阶乘: ", Factorial(10))
}
输出结果
=== RUN TestFactorial
10的阶乘: 3628800
--- PASS: TestFactorial (0.00s)
PASS
- 斐波那契数列
func Fibonacci(n int) int {if n <= 1 {return n}return Fibonacci(n-1) + Fibonacci(n-2)
}
测试方法
func TestFibonacci(t *testing.T) {fmt.Println("斐波那契数列: ", Fibonacci(10))
}
输出结果
func TestFibonacci(t *testing.T) {fmt.Println("斐波那契数列: ", Fibonacci(10))
}
4. 注意事项
- 基准条件:递归函数必须有一个或多个基准条件来终止递归调用,否则将导致栈溢出错误。
- 性能问题:递归函数在某些情况下可能导致性能问题,特别是当递归深度很大时。例如,斐波那契数列的递归实现效率很低,因为它会重复计算相同的子问题。在这种情况下,可以使用动态规划或记忆化搜索来优化。
- 栈空间:递归调用会占用栈空间,因此递归深度不宜过大。在Go语言中,可以通过设置
ulimit -s
命令来限制栈空间的大小。
源码
// recursive_function_demo.go 文件
package function_demo// Factorial 计算N的阶乘
func Factorial(n int) int {if n <= 1 {return 1}return n * Factorial(n-1)
}// Fibonacci 计算斐波那契数列的第n项
func Fibonacci(n int) int {if n <= 1 {return n}return Fibonacci(n-1) + Fibonacci(n-2)
}
// recursive_function_demo_test.go 文件
package function_demoimport ("fmt""testing"
)func TestFactorial(t *testing.T) {fmt.Println("10的阶乘: ", Factorial(10))
}func TestFibonacci(t *testing.T) {fmt.Println("斐波那契数列: ", Fibonacci(10))
}