C# 递归

调用自身的函数称为递归函数。而这种方式称为递归。

一个物理世界的例子就是放置两面平行相对的镜子。它们之间的任何物体都会被递归地反射。


递归如何工作?

A function is calling itself
C# 递归的工作原理

在上面的示例中,我们从 `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()` 方法。


阶乘程序的工作原理

下面的图片将更清楚地说明递归如何执行阶乘程序。

Finding the Factorial of a Program using Recursion
使用递归的阶乘程序

递归的优点和缺点

优点 - 使用递归,我们的代码看起来更整洁,更易读。

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

你觉得这篇文章有帮助吗?

我们的高级学习平台,凭借十多年的经验和数千条反馈创建。

以前所未有的方式学习和提高您的编程技能。

试用 Programiz PRO
  • 交互式课程
  • 证书
  • AI 帮助
  • 2000+ 挑战