Go 递归
提示
- 递归函数定义:在 Go 中,递归函数是指在其函数体内部调用自身的函数。例如
countDown(number - 1)
在countDown
函数中。 - 避免无限递归:为防止递归无限进行,通常在递归函数中使用条件语句来定义停止条件,例如使用
if...else
判断。 - 递归实例应用:递归函数可用于多种计算,如计算正整数之和或阶乘等,通过每次调用减小参数值并在满足特定条件时停止。
在计算机编程中,递归函数是指调用自身的函数。例如,
func recurse() {
… …
… …
recurse()
}
这里,recurse()
函数在其函数体内包含了对自身的调用。因此,它是一个 Go 递归函数,这种技术称为递归。
在学习递归之前,请确保了解 Go 函数。
示例:Golang 中的递归
package main
import "fmt"
func countDown(number int) {
// 显示数字
fmt.Println(number)
// 通过减少数字来递归调用
countDown(number - 1)
}
func main() {
countDown(3)
}
输出
倒计时开始:
3
2
1
0
-1
…
…
在上面的示例中,我们创建了一个名为 countDown()
的函数。请注意,我们在函数内部添加了函数调用。
countDown(number - 1)
这里,这是一个递归函数调用,并且我们在每次调用中都减少了 number 的值。
然而,这个函数将无限执行,因为我们直接在函数内部添加了函数调用。
为了避免无限递归,我们使用条件语句,并且只在满足条件时调用函数。
带条件语句的递归函数
在这个示例中,我们将使用 if...else
语句来防止无限递归。
// 使用 if…else 结束递归函数的程序
package main
import "fmt"
func countDown(number int) {
if number > 0 {
fmt.Println(number)
// 递归调用
countDown(number - 1)
} else {
// 结束递归函数
fmt.Println("倒计时停止")
}
}
func main() {
countDown(3)
}
输出
倒计时开始
3
倒计时开始
2
倒计时开始
1
倒计时开始
倒计时停止
在上面的示例中,我们在 if
语句中添加了递归调用。
if number > 0 {
fmt.Println(number)
// 递归调用
countDown(number - 1)
}
这里,我们只在 number 大于 0 时才调用函数。
如果 number 不大于 0,递归结束。这称为停止条件。
程序工作原理
number > 0 | 打印 | 递归调用 |
---|---|---|
true | 3 | countDown(2) |
true | 2 | countDown(1) |
true | 1 | countDown(0) |
false | 倒计时停止 | 函数执行停止 |
示例:Go 程序计算正数之和
package main
import "fmt"
func sum(number int) int {
// 条件以打破递归
if number == 0 {
return 0
} else {
return number + sum(number-1)
}
}
func main() {
var num = 50
// 函数调用
var result = sum(num)
fmt.Println("和:", result)
}
输出
和: 1275
在上面的示例中,我们创建了一个名为 sum()
的递归函数,如果 number 的值不等于 0,它就会调用自身。
return number + sum(number - 1)
在每次迭代中,我们通过将 number 的值减少 1 来调用函数。
程序工作原理如下:
- 在第一次调用中,number 的值是 50,它不等于 0。因此,执行 else 块,返回
50 + sum(49)
。 - 同样,49 不等于 0,因此执行
return 49 + sum(48)
。 - 这个过程持续进行,直到 number 变成 0。当 number 是 0 时,执行
return 0
并将其加到其他值中。 - 因此,最后计算并返回 50 + 49 + 48 + ...... + 0 给
main()
函数。
使用 Go 递归计算数字的阶乘
package main
import "fmt"
func factorial (num int) int {
// 条件以打破递归
if num == 0 {
return 1
} else {
// 递归调用的条件
return num * factorial (num-1)
}
}
func main() {
var number = 3
// 函数调用
var result = factorial (number)
fmt.Println("3 的阶乘是", result)
}
输出
3 的阶乘是 6
在上面的示例中,我们创建了一个名为 factorial()
的递归函数,如果 num 的值不等于 0,它就会调用自身。
return num * factorial(num - 1)
在每次调用中,我们都将 num 的值减少 1。
程序工作原理如下: