переполнение стека при рекурсии

Обсуждаются как существующие проекты (перевод документации, информационная система и т.п.), так и создание новых.

Модератор: Модераторы

переполнение стека при рекурсии

Сообщение AlexEr81 » 22.04.2016 13:02:54

Доброго всем. Вопрос в переполнении стека при вызове рекурсивной процедуры.
код такой:

Код: Выделить всё
var d :Tstrings; var i:integer; //глобальные переменные
function intToBin(Value: Longint; Digits:integer): string;
var i:integer;
begin
result:='';
if digits<=0 then exit;
for i:=0 to Digits-1 do
  if Value and(1 shl i)>0 then
  result:='1'+result
  else   result:='0'+result
end;

procedure recurs;
begin
d.Append('строка № - '+inttobin(i,15)+'|'+inttostr(i)+'|');
inc(i);
if i>=100000 then exit;
recurs;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
d:=Tstringlist.Create;
{ i:=1;
recurs;}
for i:=1 to 1000000 do
begin
d.Append('строка № - '+inttobin(i,15)+'|'+inttostr(i)+'|');
end;
d.SaveToFile('s');
d.Free;
end;   


через рекурсивную процедуру recurs код отрабатывает на i=100000 а на 200 000 уже переполнение стека
а через цикл for работает и на 1 000 000, на 10млн памяти нехватило.(на дельфи 10 млн отработало файл сформировался на ~ 368 мб довольно быстро)
вопрос в том как изменить процедуру recurs; чтобы не было переполнения стека?.

P.S. приведеный код это имитация (тестовый стенд) проблемы возникшей у меня. я читаю файл размер 5 мб. в ASN.1 кодировке, он содержит более ~200 000 тегов. которые нужно определить, определить их длину, декодировать данные. делается это с помощью рекурсивной функции. на объемах до 2 мб работает всё хорошо. а более переполняется стек.
результаты хранятся в глобальный переменной типа TSTRINGS

Добавлено спустя 2 часа 35 минут 30 секунд:
наверно правильный ответ это избавиться от рекурсии

Добавлено спустя 29 минут 6 секунд:
правильный ответ это избавиться от рекурсии и использовать цикл
AlexEr81
новенький
 
Сообщения: 17
Зарегистрирован: 24.01.2014 19:57:31

Re: переполнение стека при рекурсии

Сообщение Mirage » 23.04.2016 00:57:10

AlexEr81 писал(а):правильный ответ это избавиться от рекурсии и использовать цикл


Точно!
Mirage
энтузиаст
 
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia

Re: переполнение стека при рекурсии

Сообщение скалогрыз » 23.04.2016 00:59:57

AlexEr81 писал(а):вопрос в том как изменить процедуру recurs; чтобы не было переполнения стека?.

если я правильно помню, то размер стэка по-умолчанию в Делфи больше, чем в FPC. Но ведь есть и опция компиляции увелчить его размер. А в Лазарусе, так вообще в настройках проекта одно поле заполнить.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: переполнение стека при рекурсии

Сообщение Alex2013 » 23.04.2016 01:51:46

Я в подобных случаях делаю "свой стек" ...
(Если совсем грубо то все можно сделать например через TList .) :idea:
Alex2013
долгожитель
 
Сообщения: 3049
Зарегистрирован: 03.04.2013 11:59:44


Вернуться в Разное

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 29

Рейтинг@Mail.ru