原文: https://beginnersbook.com/2017/08/cpp-recursion/

函数调用自身的过程称为递归,相应的函数称为递归函数。理解递归的流行示例是阶乘函数。

阶乘函数: f(n) = n * f(n-1),基本条件:如果n <= 1f(n)= 1。不要担心我们将讨论什么是基本条件,以及为什么它很重要。

在下图中。我已经证明了在函数达到基本条件之前,阶乘函数如何调用自身。

C   递归 - 图1

让我们用 C++ 程序解决问题。

C++ 递归示例:阶乘

  1. #include <iostream>
  2. using namespace std;
  3. //Factorial function
  4. int f(int n){
  5. /* This is called the base condition, it is
  6. * very important to specify the base condition
  7. * in recursion, otherwise your program will throw
  8. * stack overflow error.
  9. */
  10. if (n <= 1)
  11. return 1;
  12. else
  13. return n*f(n-1);
  14. }
  15. int main(){
  16. int num;
  17. cout<<"Enter a number: ";
  18. cin>>num;
  19. cout<<"Factorial of entered number: "<<f(num);
  20. return 0;
  21. }

输出:

  1. Enter a number: 5
  2. Factorial of entered number: 120

基本情况

在上面的程序中,您可以看到我在递归函数中提供了基本条件。条件是:

  1. if (n <= 1)
  2. return 1;

递归的目的是将问题分成较小的问题,直到达到基本条件。例如,在上述阶乘程序中,我通过调用较小的阶乘函数f(n-1)来求解阶乘函数 f(n),这一直重复发生,直到n值达到基本条件(f(1) = 1)。如果未在递归函数中定义基本条件,则会出现堆栈溢出错误。

直接递归与间接递归

直接递归:当函数调用自身时,它被称为直接递归,我们上面看到的例子是直接递归示例。

间接递归:当函数调用另一个函数并且该函数调用这个函数时,这称为间接递归。例如:函数 A 调用函数 B,函数 B 调用函数 A。

C++ 中的间接递归示例

  1. #include <iostream>
  2. using namespace std;
  3. int fa(int);
  4. int fb(int);
  5. int fa(int n){
  6. if(n<=1)
  7. return 1;
  8. else
  9. return n*fb(n-1);
  10. }
  11. int fb(int n){
  12. if(n<=1)
  13. return 1;
  14. else
  15. return n*fa(n-1);
  16. }
  17. int main(){
  18. int num=5;
  19. cout<<fa(num);
  20. return 0;
  21. }

输出:

  1. 120