调用自身的函数称为递归函数。而这种技术称为递归。
一个物理世界的例子就是放置两面平行相对的镜子。它们之间的任何物体都会被递归地反射。
Swift 中递归的工作原理
func recurse() {
... ...
recurse()
... ...
}
recurse()
在这里,recurse()
函数一遍又一遍地调用自身。下图展示了递归的工作原理。

递归的停止条件
如果我们不设置任何条件来中断递归调用,函数将无限地调用自身。
我们使用if...else 语句(或类似方法)来中断递归。
通常,递归函数有两个分支:
- 一个用于递归调用。
- 另一个用于在特定条件下中断调用。
例如,
func recurse() {
if(condition) {
// break recursive call
recurse()
}
else {
// recursive call
recurse()
}
}
// function call
recurse()
示例 1:Swift 函数递归
// program to count down number to 0
func countDown(number: Int) {
// display the number
print(number)
// condition to break recursion
if number == 0 {
print("Countdown Stops")
}
// condition for recursion call
else {
// decrease the number value
countDown(number: number - 1)
}
}
print("Countdown:")
countDown(number:3)
输出
Countdown: 3 2 1 0 Countdown Stops
在上面的示例中,我们创建了一个名为 countDown()
的递归函数。在这里,函数会调用自身,直到传递给它的数字变为 0。
当number等于 0 时,if
条件中断了递归调用。
if number == 0 {
print(Countdown Stops)
}
程序的运行方式
迭代 | 函数调用 | 打印 | number == 0? |
---|---|---|---|
1 | countDown(3) |
3 | false |
2 | countDown(2) |
2 | false |
3 | countDown(1) |
1 | false |
4 | countDown(0) |
0 | true (函数调用停止) |
示例:计算数字的阶乘
func factorial(num: Int) -> Int {
// condition to break recursion
if num == 0 {
return 1
}
// condition for recursive call
else {
return num * factorial(num: num - 1)
}
}
var number = 3
// function call
var result = factorial(num: number)
print("The factorial of 3 is", result)
输出
The factorial of 3 is 6
在上面的示例中,我们有一个名为 factorial()
的递归函数。请注意这一行:
return num * factorial(num: num - 1)
在这里,我们通过减少 num 参数的值来递归调用 factorial()
。
- 最初,
factorial()
中 num 的值为 3。 - 在下一次递归调用中,num 变为 2。
- 同样,该过程一直持续到 num 变为 0。
- 当 num 等于 0 时,
if
条件中断了递归调用。
程序的工作原理

函数递归的优缺点
以下是在 Swift 编程中使用递归的优缺点。
1. 优点
- 它使我们的代码更短、更简洁。
- 递归在涉及数据结构和高级算法(如图和树遍历)的问题中是必需的。
2. 缺点
- 与迭代程序相比,它占用大量堆栈空间。
- 它使用更多的处理器时间。
- 与等效的迭代程序相比,它可能更难调试。