【问题标题】:stack overflow error when creating primes创建素数时出现堆栈溢出错误
【发布时间】:2014-08-16 19:30:24
【问题描述】:

当我运行这行代码时,当它到达素数 199 时,堆栈溢出。 当我将它作为普通 exe 运行时,它会达到 300 和 somehting。

public class primemake
{
    public Int64 prime = 2;
    public Int64 check;

    public void text()
    {
        Console.Clear();
        Console.WriteLine("welcome to prime genorator!");

        Console.WriteLine("prime:" + prime );

        Console.ReadKey();
        check = prime;
        checker();            
    }

    public void checker()       
    {   
        prime = prime + 1;
        if (check == 1)
        {                    
            text();
        }
        else if (prime % check == 0)
        {
            check = prime;
            checker();                    
        }
        else if (prime % check != 0)
        {
            check = check - 1;
            prime = prime - 1;
            checker();
        }
    }
}

有人知道发生了什么吗?非常喜欢帮助。

【问题讨论】:

  • 递归。从自身调用相同的函数,直到你用完进程提供的堆栈。
  • 在不适用 TCO 的语言/环境中嵌套的方法调用过多(在这种情况下)..
  • "任何人都知道发生了什么" ...嗯,是的,你正在耗尽堆栈。这里真正的问题是什么?
  • @user2864740 尾调用优化 (TCO) 作为尾调用优化的首字母缩写词并不是众所周知的首字母缩写词。请不要使用不成熟的首字母缩略词。

标签: c# stack


【解决方案1】:

你调用方法checker checker。这意味着它是递归的,这意味着它可能(或在您的情况下,将)在每次迭代中越来越深入地挖掘自身,最终有如此多的递归调用,正如您所观察到的那样,它会抛出 StackOverflowException。幸运的是,您无需递归即可编写此代码,只需使用循环即可。这将解决您的问题。

【讨论】:

  • 结果/异常是not always the case。 (但是,我不认为上面的代码有资格进行转换 - 可能是由于共同递归。)
  • 一点也不。我是说一个函数可以“在每次迭代中越来越深入地挖掘自身”(永远)并且不会导致异常。只是要记住的事情。
  • 这是唯一一个使用正确分析器(“StackOverflow”)直接指向网站的例外
  • @user2864740 是的,当我发布该评论时,我看到您的编辑刷新了。我删除了我的。不过,这很有趣。我不知道编译器会这样做。
  • @CarlosCosta 如果对您有帮助,请将其标记为答案,以便将来遇到类似问题的人也可以找到解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-10
  • 2023-03-30
  • 2016-11-14
  • 2010-11-14
相关资源
最近更新 更多