跳到主要内容

Swift中的递归

提示
  1. 递归函数的定义:递归是一种编程技术,其中函数通过调用自身来解决问题,形成一种循环。
  2. 递归的中断条件:为防止无限递归,必须在递归函数中设置一个明确的中断条件,通常使用if-else语句实现。
  3. 递归的优缺点:递归简化复杂问题的解决,特别适用于数据结构和算法,但可能消耗更多内存和处理器时间。

一个调用自身的 函数 被称为递归函数。这种技术被称为递归。

一个现实世界的例子是将两面平行镜子相对放置。镜子之间的任何物体都会被递归地反射。

Swift 中递归的工作原理

func recurse() {
... ...
recurse()
... ...
}

recurse()

这里,recurse() 函数一遍又一遍地调用自己。下图展示了递归是如何工作的。

Swift 递归

递归的停止条件

如果我们不设定任何条件来中断递归调用,函数将无限地调用自己。

我们使用 if...else 语句(或类似方法)来打破递归。

通常,一个递归函数有两个分支:

  • 一个用于递归调用。
  • 另一个用于在特定条件下中断调用。

例如,

func recurse() {

if(condition) {
// 中断递归调用
recurse()
}

else {
// 递归调用
recurse()
}
}

// 函数调用
recurse()

示例 1:Swift 函数递归

// 编程倒数计数到 0

func countDown(number: Int) {

// 显示数字
print(number)

// 中断递归的条件
if number == 0 {
print("倒计时停止")
}

// 递归调用的条件
else {

// 减小数字值
countDown(number: number - 1)
}
}


print("倒计时:")
countDown(number:3)

输出

倒计时:
3
2
1
0
倒计时停止

在上述示例中,我们创建了一个名为 countDown() 的递归函数。这里,函数会一直调用自己,直到传给它的数字变为 0

number 等于 0 时,if 条件中断了递归调用。

if number == 0 {
print(倒计时停止)
}

程序的工作过程

迭代函数调用打印number == 0 ?
1countDown(3)3false
2countDown(2)2false
3countDown(1)1false
4countDown(0)0true(函数调用停止)

示例:计算数字的阶乘

func factorial(num: Int) -> Int {

// 中断递归的条件
if num == 0 {
return 1
}

// 递归调用的条件
else {
return num * factorial(num: num - 1)
}

}

var number = 3

// 函数调用
var result = factorial(num: number)
print("3 的阶乘是", result)

输出

3 的阶乘是 6

在上述示例中,我们有一个名为 factorial() 的递归函数。注意以下语句

return num * factorial(num: num - 1)

这里,我们通过减小 num 参数的值递归地调用 factorial()

  • 最初,在 factorial() 内部 num 的值是 3
  • 在下一个递归调用中,num 变为 2
  • 同样地,这个过程一直持续到 num

为 0。

  • num 等于 0 时,if 条件中断了递归调用。

程序的工作过程

使用递归计算阶乘

函数递归的优势和劣势

以下是在 Swift 编程中使用递归的优势和劣势。

1. 优势

  • 它使我们的代码更简短和更清晰。
  • 在涉及数据结构和高级算法的问题中,如图和树遍历,递归是必需的。

2. 劣势

  • 与迭代程序相比,它占用更多的栈空间。
  • 它使用更多的处理器时间。
  • 与等效的迭代程序相比,它可能更难调试。