Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.11.2009, 11:42   #1
SVM
Пользователь
 
Регистрация: 06.11.2009
Сообщений: 12
По умолчанию Рекурсивный алгоритм

Здравствуйте!
Помогите пожалуйста советом: каким способом можно написать рекурсивный алгоритм с как-можно большим числом вызовов?
Я пробовал 3 метода:

Первый:
Код:
void Recur(/*Параметры*/)
{
    //Какие-то действия
    Recur(/*Параметры*/);
}
Второй:
Код:
class CRecur
{
    CRecur(/*Параметры*/)
    {
        //Какие-то действия
        CRecur r(/*Параметры*/);
    }
};
Третий:
Код:
class CRecur
{
    CRecur(/*Параметры*/)
    {
        //Какие-то действия
        CRecur* pRecur = new CRecur(/*Параметры*/);
        delete pRecur;
    }
};
Все три способа приблизительно после 30000 вызовов (вложений) завершают программу с ошибкой. Программирую на Visual C++ 2008 Express edition.

Последний раз редактировалось Stilet; 12.11.2009 в 12:26.
SVM вне форума Ответить с цитированием
Старый 12.11.2009, 12:26   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Во-первых: Какой ошибкой?
Во-вторых: //Какие-то действия - это какие?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 12.11.2009, 13:05   #3
SVM
Пользователь
 
Регистрация: 06.11.2009
Сообщений: 12
По умолчанию

Действия произвольные, не связанные с выделением памяти.
В моем случае: функция осуществляет заливку определенным цветом области графического файла (заливка как в пейнте). Проверял неоднократно, выход за границы графики не происходит.

Ошибка такого плана: "необработанное исключение" и дебугер указывает на место вызова следующего екземпляра функции. То есть на: Recur(/*Параметры*/);, CRecur r(/*Параметры*/);, CRecur* pRecur = new CRecur(/*Параметры*/);.
SVM вне форума Ответить с цитированием
Старый 12.11.2009, 13:07   #4
ds.Dante
Старожил
 
Аватар для ds.Dante
 
Регистрация: 06.08.2009
Сообщений: 2,992
По умолчанию

Просто стек переполняется. Думаю, неважно каким способом делать. Если такая ошибка возникает в работе - надо переделывать алгоритм, чтобы без рекурси было.
ds.Dante вне форума Ответить с цитированием
Старый 12.11.2009, 13:17   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Действия произвольные, не связанные с выделением памяти.
Ради бога, а выход из рекурсии по некому условию предусмотрен?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 12.11.2009, 21:54   #6
SVM
Пользователь
 
Регистрация: 06.11.2009
Сообщений: 12
По умолчанию

Ошибка вот такая:
Необработанное исключение в "0x7c812aeb" в "DDRace1.exe": Исключение Microsoft C++: std::bad_alloc по адресу 0x00033720..
Код вот такой:
Код:
CFill(int X, int Y, tCellNum CN, CG* pG)
{
//ShowMessage(Y,X); tCellNum CNC = pG->field.Field[Y][X]; if(CNC==CN)return; pG->field.Field[Y][X]=CN; int R = X+1; if(R<pG->field.GetSizeX())if(pG->field.Field[Y][R]==CNC) {//Right
CFill* pFill = new CFill(R,Y,CN,pG);delete pFill;
} int D = Y-1; if(D>-1)if(pG->field.Field[D][X]==CNC) {//Down
CFill* pFill = new CFill(X,D,CN,pG);delete pFill;
} int L = X-1; if(L>-1)if(pG->field.Field[Y][L]==CNC) {//Left
CFill* pFill = new CFill(L,Y,CN,pG);delete pFill;
} int U = Y+1; if(U<pG->field.GetSizeY())if(pG->field.Field[U][X]==CNC) {//Up
CFill* pFill = new CFill(X,U,CN,pG);delete pFill;
}
};

Последний раз редактировалось Sazary; 13.11.2009 в 01:31.
SVM вне форума Ответить с цитированием
Старый 12.11.2009, 22:54   #7
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

std::bad_alloc вылетает когда память не удаётся выделить, а это обычно когда она кончается. Эта рекурсия всю оперативку хавает походу. Оно в принципе и не странно. В конструкторе объекта создавать кучу таких же объектов... Была бы это хотя бы обычная функция, а не конструктор... Кошмар, в общем
pu4koff вне форума Ответить с цитированием
Старый 13.11.2009, 09:24   #8
SVM
Пользователь
 
Регистрация: 06.11.2009
Сообщений: 12
По умолчанию

К pu4koff-у.
Всю оперативку не хавает, это точно. А вот стек переполнятся конечно может.

Ко всем остальным: в этой функции рекурсия стремиться к нерекурсии!!!

У меня просьба: есть ли ссылка на литературу, в которой описывается где С++ распределяет новосозданный объект в различных ситуациях?
SVM вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Рекурсивный поиск папок FindFirst Lehanidze Помощь студентам 4 06.08.2009 13:13
Java ME Рекурсивный метод поиска в подпапках Клык Помощь студентам 0 31.07.2009 16:06
Сортировка, поиск, рекурсивный алгоритм Delphi Stases Помощь студентам 4 29.05.2009 01:15
Разработать рекурсивный алгоритм lucky Паскаль, Turbo Pascal, PascalABC.NET 4 08.05.2009 15:04
Рекурсивный SQL запрос ADSoft SQL, базы данных 5 02.06.2008 16:55