试图使用递归找到一个数字的所有因子,最终会得到大数字的分割错误

Trying to find all factors of a number using recursion, end up with a segmentation fault for large numbers

本文关键字:数字 错误 分割 递归 一个      更新时间:2023-10-16

为什么会出现分段错误?我想找到一个数字的所有因子并将它们放在一个向量中。我还有另一个函数可以做同样的事情,但它使用 while 循环。所以我想我会尝试递归。"i"最初从 1 开始,除非我在 main.cpp 中放入其他值。"cout i"行就在那里,所以我可以看到它在哪里失败。

void recurfact ( std::vector <int> & facts, int numb, int i ) 
{
  std::cout << i << std::endl;
  if ( i  > numb )
    {
      return;
    }
  if ( numb % i == 0 )
    {
      facts.push_back(i);
      i = i + 1;
      recurfact ( facts, numb, i );
    }
  else
    {
      i = i + 1;
      recurfact ( facts, numb, i );
    }
}

因此,如果我使用小于 42800 +/- 100 的数字对其进行测试,这将起作用。如果我尝试任何大于该数字的数字,它就会停止。调试器指出存在分段错误。如果我注释掉push_back行,它仍然在该 i 值处崩溃。

但是,如果我从i = 45000

开始,我可以毫无问题地测试从45000到85000的数字。高于 85000 它会崩溃。

我想知道为什么会这样。

在 Windows 7 上的 cygwin 中使用 gcc 编译。

来自 gdb 的错误消息是:

程序接收信号SIGSEGV,分段错误。 0x000007fefcec10d6 in WaitForSingleObjectEx () 来自/cygdrive/c/Windows/system32/KERNELBASE

.dll

请参阅有关 Unix 类型系统上的分段错误的文档:

http://www.cs.nyu.edu/exact/core/doc/stackOverflow.txt

在类Unix系统下,程序可能会抛出"分段错误" 错误。 这可能是由于堆栈溢出,尤其是来自递归的溢出 函数调用或大型数据集。 在我们的演示程序"Pi"中(请参阅 "$(CORE_PATH)/progs/pi"),我们将 Pi 计算为任意数量的所需位 或数字。 以下是有关堆栈溢出何时会 在不同的平台上发生,使用其默认堆栈大小。