Swift 递归
在本教程中,我们将学习 Swift 中的递归函数及其使用实例。
调用自身的函数称为递归函数。这种技术称为递归。
物理世界的一个例子是放置两个平行的镜子,它们面对面。它们之间的任何对象都将被递归反映。
Swift 中递归的工作
func recurse() {
... ...
recurse()
... ...
}
recurse()
这里,recurse()
函数正在反复调用自己。下图显示了递归的工作原理。
递归的停止条件
如果我们没有提到任何打破递归调用的条件,函数将继续无限地调用自身。
我们使用 if…else
语句(或类似的方法)来中断递归。
通常,递归函数有两个分支:
- 一个用于递归调用。
- 另一种是在某些情况下中断调用。
例如,
func recurse() {
if(condition) {
// break recursive call
recurse()
}
else {
// recursive call
recurse()
}
}
// function call
recurse()
实例 1:函数递归
// 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(function call stops) |
实例 2:求一个数的阶乘
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.缺点
- 与迭代程序相比,它占用了大量堆栈空间。
- 它需要更多的处理器时间。
- 与等效的迭代程序相比,它可能更难调试。