跳到主要内容

Go 递归

提示
  1. 递归函数定义:在 Go 中,递归函数是指在其函数体内部调用自身的函数。例如 countDown(number - 1)countDown 函数中。
  2. 避免无限递归:为防止递归无限进行,通常在递归函数中使用条件语句来定义停止条件,例如使用 if...else 判断。
  3. 递归实例应用:递归函数可用于多种计算,如计算正整数之和或阶乘等,通过每次调用减小参数值并在满足特定条件时停止。

在计算机编程中,递归函数是指调用自身的函数。例如,

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打印递归调用
true3countDown(2)
true2countDown(1)
true1countDown(0)
false倒计时停止函数执行停止

使用 go 递归打印倒计时

示例: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 + ...... + 0main() 函数。

使用 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

程序工作原理如下:

使用递归计算阶乘