调用自身的函数称为递归函数。而这种方式称为递归。
一个物理世界的例子就是放置两面平行相对的镜子。它们之间的任何物体都会被递归地反射。
递归如何工作?

在上面的示例中,我们从 `Main` 方法(普通方法调用)内部调用了 `recurse()` 方法。而在 `recurse()` 方法内部,我们再次调用了同一个 `recurse()` 方法。这就是递归调用。
要停止递归调用,我们需要在方法内提供一些条件。否则,该方法将无限调用。
因此,我们使用 if...else 语句(或类似方法)来终止方法内的递归调用。
示例:使用递归计算数字的阶乘
正数 `n` 的阶乘由下式给出
factorial of n (n!) = 1 * 2 * 3 * 4....n
在 C# 中,我们可以使用递归来查找数字的阶乘。例如,
using System;
class Program
{
public static void Main()
{
int fact, num;
Console.Write("Enter a number: ");
// take input from user
num = Convert.ToInt32(Console.ReadLine());
Program obj = new Program();
// calling recursive function
fact = obj.factorial(num);
Console.WriteLine("Factorial of {0} is {1}", num, fact);
}
// recursive function
public int factorial(int num)
{
// termination condition
if (num == 0)
return 1;
else
// recursive call
return num * factorial(num - 1);
}
}
输出
Enter a number: 4 Factorial of 4 is 24
在上面的示例中,我们有一个名为 `factorial()` 的方法。我们将一个变量 `num` 作为参数传递给了 `factorial()`。
`factorial()` 方法是从 `Main()` 方法调用的。在 `factorial()` 内部,请注意以下语句
return num * factorial(num - 1);
这里,`factorial()` 方法调用了自身。最初,`factorial()` 内部 `num` 的值为 **4**。在下一次递归调用期间,将 **3** 传递给 `factorial()` 方法。此过程一直持续到 `num` 等于 **0**。
当 `num` 等于 **0** 时,`if` 语句返回 `true`,因此返回 **1**。最后,累积的结果被传递给 `Main()` 方法。
阶乘程序的工作原理
下面的图片将更清楚地说明递归如何执行阶乘程序。

递归的优点和缺点
优点 - 使用递归,我们的代码看起来更整洁,更易读。
缺点 - 当进行递归调用时,会在堆栈上为变量分配新的存储位置。随着每次递归调用返回,旧的变量和参数会从堆栈中移除。因此,递归通常使用更多的内存,并且通常速度较慢。