Swift 递归
在本教程中,我们将学习 Swift 中的递归函数及其使用实例。
调用自身的函数称为递归函数。这种技术称为递归。
物理世界的一个例子是放置两个平行的镜子,它们面对面。它们之间的任何对象都将被递归反映。
Swift 中递归的工作
func recurse() {... ...recurse()... ...}recurse()
这里,recurse() 函数正在反复调用自己。下图显示了递归的工作原理。

递归的停止条件
如果我们没有提到任何打破递归调用的条件,函数将继续无限地调用自身。
我们使用 if…else 语句(或类似的方法)来中断递归。
通常,递归函数有两个分支:
- 一个用于递归调用。
- 另一种是在某些情况下中断调用。
例如,
func recurse() {if(condition) {// break recursive callrecurse()}else {// recursive callrecurse()}}// function callrecurse()
实例 1:函数递归
// program to count down number to 0func countDown(number: Int) {// display the numberprint(number)// condition to break recursionif number == 0 {print("Countdown Stops")}// condition for recursion callelse {// decrease the number valuecountDown(number: number - 1)}}print("Countdown:")countDown(number:3)
结果如下:
Countdown:3210Countdown 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 recursionif num == 0 {return 1}// condition for recursive callelse {return num * factorial(num: num - 1)}}var number = 3// function callvar 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.缺点
- 与迭代程序相比,它占用了大量堆栈空间。
- 它需要更多的处理器时间。
- 与等效的迭代程序相比,它可能更难调试。