Go语言递归函数的用法(附带实例)
递归函数是函数在自身的函数体内调用自身,使用递归函数时一定要当心,处理不当将使程序进入无限循环。
递归函数经常用于解决一些数学问题,如计算数字的阶乘、生成斐波那契数列等。
递归函数的基本语法格式如下:
代码如下:
【实例】输出指定长度的斐波那契数列。
斐波那契数列又称黄金分割数列,它是由意大利数学家列昂纳多·斐波那契提出的。斐波那契数列指的是这样一个数列:1, 1, 2, 3, 5, 8, 13, 21, 34,... 从第 3 项开始,该数列的每一项都等于前两项之和。编写程序输出一段指定长度的斐波那契数列。代码如下:
在每次执行递归操作时,参数 n 逐渐减小,直到 n 小于或等于 2 时结束递归操作。
递归函数经常用于解决一些数学问题,如计算数字的阶乘、生成斐波那契数列等。
递归函数的基本语法格式如下:
func 函数名([参数 1]) [返回类型]{ 函数名([参数 2]) }例如,使用递归函数计算 10 的阶乘 10! 的值,其中 10!=1098!,而 9!=987!,以此类推,最后 1!=1,这样的数学公式可以使用递归函数进行描述,使用 f(n) 表示 n! 的值:
- 当 1<n<=10 时,f(n)=n*f(n-1);
- 当 n<=1 时,f(n)=1。
代码如下:
package main import "fmt" func f(num int) int { // 定义递归函数 if num <= 1 { // 如果参数 num 的值小于或等于 1 // 则返回 1 return 1 } else { // 递归调用 return f(num-1) * num // 返回 num * f(num-1) } } func main() { n := 10 // 调用递归函数 result := f(n) // 调用递归函数 fmt.Printf("%d!的结果为:%d", n, result) // 输出结果 }运行结果如下。
10!的结果为:3628800
在定义递归函数时需要两个必要条件:- 结束递归的条件:如上面示例中的 if num <= 1 语句,如果满足条件,则执行 return 1 语句,不再递归。
- 递归调用语句:如上面示例中的 return f(num-1) * num 语句,用于实现递归调用。
【实例】输出指定长度的斐波那契数列。
斐波那契数列又称黄金分割数列,它是由意大利数学家列昂纳多·斐波那契提出的。斐波那契数列指的是这样一个数列:1, 1, 2, 3, 5, 8, 13, 21, 34,... 从第 3 项开始,该数列的每一项都等于前两项之和。编写程序输出一段指定长度的斐波那契数列。代码如下:
package main import ( "fmt" ) func recursion(n int) int { // 定义递归函数 if n <= 2 { // 第一项和第二项 // 直接返回 1 return 1 } return recursion(n-1) + recursion(n-2) // 递归,计算前两项的和 } func main() { // 定义数列长度 n := 10 // 遍历输出数列 for i := 1; i <= n; i++ { fmt.Print(recursion(i), " ") } }运行结果如下:
1 1 2 3 5 8 13 21 34 55
在上述代码中,recursion() 函数是递归函数,参数 n 表示数列中的第几项:- 当参数 n 小于或等于 2 时,直接返回 1,表示数列的前两项都是 1;
- 当参数 n 大于 2 时递归调用 recursion() 函数,参数分别是 n-1 和 n-2,表示数列中的第 n 项等于前两项之和。
在每次执行递归操作时,参数 n 逐渐减小,直到 n 小于或等于 2 时结束递归操作。