Пытаясь найти все факторы числа с помощью рекурсии, в конечном итоге возникает ошибка сегментации для больших чисел

0

Почему возникает ошибка сегментации? Я хочу найти все факторы числа и поместить их в вектор. У меня есть другая функция, которая делает то же самое, кроме использования цикла 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.

Однако, если я начну с я = 45000, я могу проверить число от 45000 до 85000 без проблем. Выше чем 85000 он падает.

Мне нравится знать, почему это происходит.

Компиляция с gcc в cygwin на windows 7.

Сообщение об ошибке из gdb:

Программный сигнал SIGSEGV, ошибка сегментации. 0x000007fefcec10d6 в WaitForSingleObjectEx() из /cygdrive/c/Windows/system32/KERNELBASE.dll

  • 0
    Разве размер стека по умолчанию не превышает 8 МБ в Windows для GCC? Я знаю, что для .Net это 1 МБ на поток. Обычно я переключаюсь на явную рекурсию (возможно, использую vector<> в качестве стека) с итерацией, которая перемещает хранилище в кучу. Конечно, есть несколько отличных алгоритмов, если вы просто хотите найти простые числа.
  • 2
    Вы забыли задать вопрос. Хотите знать, почему это так? Хотите знать, что с этим делать? Или что?
Показать ещё 3 комментария
Теги:
recursion
segmentation-fault
cygwin
factoring

1 ответ

0
Лучший ответ

См. Этот документ о неисправности сегментации в системах Unix:

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

В Unix-подобных системах программы могут вызывать ошибку "Ошибка сегментации". Это может быть связано с переполнением стека, особенно из рекурсивных вызовов функций или огромных наборов данных. В нашей демо-программе "Pi" (см. "$ (CORE_PATH)/progs/pi") мы вычисляем Pi на любое количество желаемых бит или цифр. Ниже приведены некоторые результаты тестирования, когда переполнение стека будет происходить на разных платформах, используя их размеры стека по умолчанию.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню