22.md 2.2 KB
Newer Older
W
wizardforcel 已提交
1 2 3 4 5 6 7 8 9 10
# C++ 递归

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

#### 在本教程中,我们将通过示例学习 C++ 中的递归函数及其工作。

调用自身的[函数](/cpp-programming/function)被称为递归函数。 并且,这种技术称为递归。

* * *

W
wizardforcel 已提交
11
## C++ 中的递归工作原理
W
wizardforcel 已提交
12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32

```cpp
void recurse()
{
    ... .. ...
    recurse();
    ... .. ...
}

int main()
{
    ... .. ...
    recurse();
    ... .. ...
}
```

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

![Working of C++ recursion](img/88b4dfabbc74026f99e2465b25e8155d.png "Working of C++ recursion")

W
wizardforcel 已提交
33
C++ 编程中递归的工作方式
W
wizardforcel 已提交
34 35 36 37 38



递归一直持续到满足某些条件为止。

W
wizardforcel 已提交
39
为了防止无限递归,可以在一个分支进行递归调用而另一个不进行递归调用的情况下使用[`if...else`语句](/cpp-programming/if-else)(或类似方法)。
W
wizardforcel 已提交
40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81

* * *

## 示例 1:使用递归的数字阶乘

```cpp
// Factorial of n = 1*2*3*...*n

#include <iostream>
using namespace std;

int factorial(int);

int main() {
    int n, result;

    cout << "Enter a non-negative number: ";
    cin >> n;

    result = factorial(n);
    cout << "Factorial of " << n << " = " << result;
    return 0;
}

int factorial(int n) {
    if (n > 1) {
        return n * factorial(n - 1);
    } else {
        return 1;
    }
}
```

**输出**

```cpp
Enter a non-negative number: 4
Factorial of 4 = 24
```

* * *

W
wizardforcel 已提交
82
### 递归程序的工作原理
W
wizardforcel 已提交
83 84 85

![Working of C++ Recursion Program](img/189663c7cf2c2d616a63ca6b0f639f5e.png "Working of C++ Recursion Program")

W
wizardforcel 已提交
86
C++ 递归程序如何工作
W
wizardforcel 已提交
87 88 89



W
wizardforcel 已提交
90
如我们所见,`factorial()`函数正在调用自身。 但是,在每次通话期间,我们将`n`的值减小了`1`。 当`n`小于`1`时,`factorial()`函数最终返回输出。
W
wizardforcel 已提交
91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108

* * *

## 递归的优缺点

以下是在 C++ 中使用递归的优缺点。

* * *

### C++ 递归的优点

*   它使我们的代码更短,更清晰。
*   在涉及数据结构和高级算法(例如图形和树遍历)的问题中需要递归。

* * *

### C++ 递归的缺点

W
wizardforcel 已提交
109
*   与迭代程序相比,它占用大量栈空间。
W
wizardforcel 已提交
110 111
*   它使用更多的处理器时间。
*   与等效的迭代程序相比,调试起来会更加困难。