33.md 3.2 KB
Newer Older
W
wizardforcel 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
# 快速递归

> 原文: [https://www.programiz.com/swift-programming/recursion](https://www.programiz.com/swift-programming/recursion)

#### 在本文中,您将学习创建递归函数。 一个自我调用的函数。

调用自身的[函数](/swift-programming/functions "Swift functions")被称为递归函数。 并且,这种技术称为递归。 创建递归函数时,必须创建一个条件,以使函数不会无限期地(无限期地)调用自身。

## 递归在 Swift 中如何工作?

```swift
func recurse() {
    //statements
    recurse()
}
recurse()

```

下图显示了递归调用的方式。

![How recursion works in Swift?](img/7c35a6a9805fa03838068870dec5f74d.png "How recursion works in Swift?")

在上面的流程图中,递归是无限执行的。 但是,几乎所有情况下,您都会创建一个递归,该递归将一直执行到满足某些条件为止。

W
wizardforcel 已提交
26
为防止无限递归,请在 [Swift 条件语句](/swift-programming/expressions-statements-blocks#control-flow-statements "Swift control flow statements")中使用递归调用,例如[`if...else`语句](/swift-programming/if-else-statement "Swift if-else statement")
W
wizardforcel 已提交
27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52

* * *

## 示例 1:打印 N 个正数

```swift
func countDownToZero(num: Int) {
    print(num)
    if num > 0 {
        countDownToZero(num: num - 1)
    }
}
print("Countdown:")
countDownToZero(num:3) 
```

当您运行以下程序时,输出将是:

```swift
Countdown:
3
2
1
0
```

W
wizardforcel 已提交
53
在上述程序中,语句`print("Countdown:")`在控制台中输出`Countdown`。 语句`countDownToZero(num:3)`调用带有参数`Integer`的函数。
W
wizardforcel 已提交
54 55 56 57 58 59 60

执行函数`countDownToZero()`内的语句,如果满足条件`num > 0`,则再次调用函数`countDownToZero()`作为`countDownToZero(num: num - 1)`

如果不满足条件,则函数调用不会完成,并且递归会停止。

### 让我们逐步来看一下

W
wizardforcel 已提交
61 62
Execution steps

W
wizardforcel 已提交
63
| 步骤 | 函数调用 | 打印 | `num > 0`? |
W
wizardforcel 已提交
64 65
| --- | --- | --- | --- |
| 1 | `countDownToZero(3)` | **3** | 是 |
W
wizardforcel 已提交
66 67 68
| 2 | `countDownToZero(2)` | **2** | 是 |
| 3 | `countDownToZero(1)` | **1** | 是 |
| 4 | `countDownToZero(0)` | **0** | 否(结束) |
W
wizardforcel 已提交
69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99

* * *

## 示例 2:查找数字的阶乘

```swift
func factorial(of num: Int) -> Int {
    if num == 1 {
        return 1
    } else {
        return num * factorial(of:num - 1)
    }
}

let x = 4
let result = factorial(of: x)
print("The factorial of \(x) is \(result)") 
```

When you run the following program, the output will be:

```swift
The factorial of 4 is 24
```

### 这个例子是如何工作的?

![How recursion works for factorial in Swift](img/881da150029a67cdc3c4c32b4d3adfaa.png "How recursion works for factorial in Swift")

### Let's see this in steps

W
wizardforcel 已提交
100 101
Execution steps

W
wizardforcel 已提交
102
| 步骤 | 传递的参数 | `return`语句 | 值 |
W
wizardforcel 已提交
103
| --- | --- | --- | --- |
W
wizardforcel 已提交
104 105 106 107
| 1 | 4 | `return 4 * factorial(of:3)` | `4 * factorial(of:3)` |
| 2 | 3 | `return 3 * factorial(of:2)` | `4 * 3 * factorial(of:2)` |
| 3 | 2 | `return 2 * factorial(of:1)` | `4 * 3 * 2 * factorial(of:1)` |
| 4 | 1 | `return 1` | `4 * 3 * 2 * 1` |
W
wizardforcel 已提交
108 109

当可以在大约两个步骤中找到问题的解决方案时,通常将递归用作迭代的替换。 如果没有重复该过程,则第一步将搜索解决方案。