gpt4 book ai didi

c# - 调用堆栈如何在 C# 应用程序中工作(给出的简单示例)

转载 作者:行者123 更新时间:2023-11-30 22:09:14 27 4
gpt4 key购买 nike

我从来没有深入研究过算法。目前我失业了,所以我决定学习更多关于递归的知识以及如何使用它。我已经多次学习基础知识,我知道如何解决简单的问题,例如 fibonacci numbersfactorial 但这是因为这些问题最常作为示例给出,当有人试图解释递归。

但是今天我又开始制作一个简单的控制台应用程序来计算阶乘,只是想看看这次我是否能得到更多东西,我遇到了这种情况,我认为我的理解不仅对递归有很大的漏洞但总的来说,堆栈是如何工作的,为什么事情会这样发生,而且由于这个例子非常简单,我认为它可能是一个完美的基础,我可以尝试找到一些新的方法来解决同样的问题(如何 self 学习递归地思考)。

原来如此。对于阶乘计算,我制作了这个简单的类/方法来从控制台获取数字。我只是不想让所有东西都变成静态的,但也没有特别的理由让它像这样,我只是做了,所以我最终得到了这个类:

class GetUserInput
{
public int GetFactorialNumber()
{
Console.Write("Enter number: ");
int number;
bool result = Int32.TryParse(Console.ReadLine(), out number);
while (!result)
{
Console.WriteLine("Error!");
GetFactorialNumber();
}
return number;
}
}

在我的 Main 方法中我有这个:

GetUserInput GetNumber = new GetUserInput();
int number = GetNumber.GetFactorialNumber();

那么会发生什么:

  1. 我启动程序并输入无法解析为 int 的内容,例如 dfgdf,在 y 调试器中我看到了:

First

  1. 我遇到了错误,我被要求再次输入数字,所以这次我输入了一个有效的数字,比如5,我在调试器中看到了这个:<

Second

  1. 我进入了无限循环。即使我从现在起只输入有效整数,我仍然会看到第一个无效调用:

Three

这种情况会一直持续下去。无论我从现在开始输入什么,如果它无效,该方法将保留在 Call stack 中,如果输入有效,则该方法将被删除,但一旦我无法退出循环第一次输入无效数据。

基于这个简单的例子,你能解释一下这里到底发生了什么吗?老实说,起初我认为这实际上会起作用。我的意思是 - 我得到了正确的输入,我退出了 while 循环,我点击了 return 就这样,return,我退出了这个方法。然后,当我看到我进入无限循环时,我试图向自己解释这是什么原因,因为我有一个 self 调用的方法,我想我已经创建了某种递归,但这就是我得到的地方丢失 - 堆栈究竟是如何工作的以及为什么我无法摆脱它(在这种情况下但通常也是如此)?因为主要的想法是让我理解递归究竟是如何工作的,你能给我解释一下,Call stack 是如何工作的,以及我的代码是如何与它交互以获得我所描述的结果的吗?

最佳答案

为什么不去掉这里的递归:

public int GetFactorialNumber()
{
Console.Write("Enter number: ");
int number;

while (!Int32.TryParse(Console.ReadLine(), out number))
Console.WriteLine("Error!");

return number;
}

如果你想保持你的方式:

public int GetFactorialNumber()
{
Console.Write("Enter number: ");
int number;
while (!Int32.TryParse(Console.ReadLine(), out number))
{
Console.WriteLine("Error!");

** return **GetFactorialNumber(); // Code needs a chance to escape the while
}
return number;
}

关于c# - 调用堆栈如何在 C# 应用程序中工作(给出的简单示例),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21688676/

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