不断获得堆栈溢出-Euclid的数字

时间:2019-12-09 06:15:34

标签: c# recursion

我正在使用c#进行编码。我正在寻找找到两个输入值的最大公分母。 有一些有效的数字,例如100&200、50&150、2&12等。但是当我输入78以外的任何数字时,我都会不断收到堆栈溢出消息。

我在下面附上了我的代码。

有人可以告诉我为什么我会收到此消息吗?

using System;
namespace Euclid_App
{
   class Euclidbackground
   {
       public static long GreatestCommoner(long first, long second)
       {
           while (first != second)
           {
               if (first > second)
               {
                   return GreatestCommoner(first - first , second);
               }
               else
               {
                   return GreatestCommoner(first, second - first);
               }
           }
           return first;
       }
   }
   class Program
   {
        static void Main(string[] args)
       {
           long onenum;
           long twonum;
           Console.WriteLine("Type first number:");
           onenum = Convert.ToInt64(Console.ReadLine());
           Console.WriteLine("Type second number:");
           twonum = Convert.ToInt64(Console.ReadLine());
           long answer = Euclidbackground.GreatestCommoner(onenum, twonum);
           Console.WriteLine(answer);
           Console.ReadKey();
       }
   }
}

1 个答案:

答案 0 :(得分:2)

这是一个错字:

                         //this is always 0
 return GreatestCommoner(first - first , second);

将此行替换为:

 return GreatestCommoner(first - second, second);

顺便说一句,这个while循环是不必要的,因为它只有一个迭代,所以您应该用if语句替换它。

P.S。您可能需要为输入参数添加一些验证。像这样:

Debug.Assert(first>0);
Debug.Assert(second>0);

可以保护您免受无效呼叫的困扰。

P.P.S。另外,练习调试技巧。简单明了的东西:

Console.WriteLine(first+" "+second);

将帮助您更好地理解问题。如果您拥有IDE,则应该可以使用更方便的调试工具。