gpt4 book ai didi

c# - 使用递归方法调用的阶乘计算

转载 作者:太空宇宙 更新时间:2023-11-03 17:30:53 24 4
gpt4 key购买 nike

这段代码来自《C# 5.0 in a Nutshell》一书,是 LinqPad 上的示例。在第 39 页上说:

"这个方法是递归的,就是调用自己,每次进入这个方法,在堆栈上分配一个新的 int,每次方法退出时,int 是释放。”

使用文字 5 产生 120 的答案(3 产生 6)

谁能解释一下这是如何工作的?我是一名尝试学习 C# 的 VB 程序员,并且想了解这样的结构。我已经单步执行了很多次,无法理解 x == 0 并返回 1 之后会发生什么。直到 x 等于零,执行流程很容易理解。在那之后,最后一个 return 语句似乎被重复执行(神奇地)直到 x 递增回到它的原始值然后返回到它最初被调用的点并产生上述(神奇的)数字结果.

static void Main()
{
Console.WriteLine (Factorial(5));
}
static int Factorial (int x)
{
if (x == 0) return 1;
return x * Factorial (x-1);
}

最佳答案

Call Factorial(3) (which returns 3 * 2)
x doesn't == 0
return 3 * Factorial(2)
Calls Factorial(2) (which returns 2 * 1)
x doesn't == 0
return 2 * Factorial(1)
Calls Factorial(1) (which returns 1 * 1)
x doesn't == 0
return 1 * Factorial(0)
Calls Factorial(0) (which returns 1)
x == 0 so return 1

重要的一点是递归函数必须有一个终止条件,否则它会无限地调用自己(直到用完堆栈空间)。在您的示例中,if (x == 0) return 1; 是终止条件。由于函数调用自身的参数值比调用时的参数值小一,最终它会以 0 结束调用自身,这就是递归结束的时候。

不过,这会引出此代码的问题。如果你用一个负数调用,它会递归地用越来越多的负数调用自己,永远不会达到 0,你最终会耗尽堆栈空间。不过,如何最好地处理这个问题可能超出了您的问题范围。

关于c# - 使用递归方法调用的阶乘计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27307229/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com