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

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

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

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

Сообщение об ошибке от GDB:

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

0

Решение

Посмотрите этот документ о сбое сегментации в системах типа Unix:

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

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

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]