【发布时间】:2018-11-09 01:38:50
【问题描述】:
我之前创建了一个简单的计算器,现在我正在尝试通过内置更多错误处理来改进它。我正在尝试调用一个函数来读取一个 int,尝试解析,如果它失败了重新调用函数直到TryParse()成功。
我的问题是错误的路径没有返回值,所以它不会编译。我确定我缺少一个简单的步骤,有人可以帮我一些建议吗?这个问题可以在GetNumber() 内解决吗?还是应该在Main() 内有条件地调用该函数?还要别的吗?
using System;
class Program
{
static int GetNumber()
{
Console.WriteLine("Enter a number");
string entry = Console.ReadLine();
int num;
bool res = int.TryParse(entry, out num);
if (res == true)
{
return num;
}
if (res == false)
{
Console.WriteLine("You did not enter a proper number");
GetNumber();
}
}
static void Main()
{
int x = GetNumber();
}
}
【问题讨论】:
-
递归在这里没有帮助,你所需要的只是一个在输入有效数字时退出的循环。 (您不关心以前的失败。递归很高兴将它们堆积在调用堆栈上。)除此之外:退出不愉快函数的几个选项是:(A)使其返回可空类型,例如
int?,如果没有有效输入则返回null。这使调用者的事情变得复杂,但事实就是如此。 (2) 使用throw向调用者报告适当的异常。他们会收到消息。 -
关于
if语句:通常if (res)足以测试boolean的真实性。无需深入检查,例如(res == true)或 ( ( res == true ) == true ). And in many cases the other value of aboolean` 是false并且可以使用else子句而不是独立的if语句轻松处理。 -
非常感谢您的反馈!我对您关于不需要递归的声明 HABO 有疑问。如果我要包含递归,是否有可能通过反复输入非整数(失败)语句并让堆栈最终堆积太多东西而给我的程序带来问题?例如,如果有人要给它一个字母或单词的永无止境的循环。
-
是的,每个级别的递归都需要额外的堆栈空间。在这种情况下,这可能不是一个现实的问题,即您没有为每次递归分配太多内存,并且在数千次尝试后,生物可能会厌倦输入错误数据。当您需要保留现有的 state 时,递归很有用,例如当您尝试做出可能效果不佳的动作时,棋盘上的棋子。您可以简单地备份几个步骤并返回到较早的状态。有些问题可以通过循环或递归巧妙地解决,例如计算一个数的阶乘。
标签: c# recursion calculator