【问题标题】:C# recursive statement in calculator error计算器错误中的C#递归语句
【发布时间】: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 a boolean` 是 false 并且可以使用 else 子句而不是独立的 if 语句轻松处理。
  • 非常感谢您的反馈!我对您关于不需要递归的声明 HABO 有疑问。如果我要包含递归,是否有可能通过反复输入非整数(失败)语句并让堆栈最终堆积太多东西而给我的程序带来问题?例如,如果有人要给它一个字母或单词的永无止境的循环。
  • 是的,每个级别的递归都需要额外的堆栈空间。在这种情况下,这可能不是一个现实的问题,即您没有为每次递归分配太多内存,并且在数千次尝试后,生物可能会厌倦输入错误数据。当您需要保留现有的 state 时,递归很有用,例如当您尝试做出可能效果不佳的动作时,棋盘上的棋子。您可以简单地备份几个步骤并返回到较早的状态。有些问题可以通过循环或递归巧妙地解决,例如计算一个数的阶乘。

标签: c# recursion calculator


【解决方案1】:

在递归 GetNumber 之前添加一个返回值。这将在最终返回到您的 Main 方法之前将递归值返回到链上。

您可以完全删除第二个 if 语句,因为只有当 res 为 false 时您才会出现。这不会影响功能,只是使其更易于阅读。

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;
    }

    Console.WriteLine("You did not enter a proper number");
    return GetNumber();        
}

【讨论】:

    猜你喜欢
    • 2019-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-05
    • 1970-01-01
    • 2013-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多