Рекурсивный просмотр списка.

Ответить
Svin
Сообщения: 3
Зарегистрирован: 31 мар 2009, 19:04

Доброго времени суток уважаемые знатоки. Пишу программку и возникла проблема :
Мне необходима функция которая бы вызывала сама себя ( рекурсивная ) и выполняла следующее действия:

Заносила в массив array[1..10] of integer значение first^.inf , не кольцевого списка.

Как я понимаю, функция должна после выполнения присваивания И-тому элементу массива значения из списка перейти к другому элементу , притом зделать это вызвав саму себя ( прокрутив сценарий повторно но с учетом что и:=и+1 ). Звучит бредово и я знаю , что тут попахивает китайским комсомолом ( можно мою проблему без рекурсии решить в 4 строки текста программы ) , но так сказано в тексте задачи. Идей было много , но не один из моих методов не работает.

Надеюсь на вас!
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

Код: Выделить всё

type
  TInf=......;
  PItem=^Titem;
  TItem=record
     inf:TInf;
     next:PItem;
  End;
  TStorage=array[1..N] of TInf;

function SaveToAray(Item:PListItem, Srorage:TStorage,Pos:integer, Limit:integer):integer;
begin
  if (Item=nil) or (Pos>Limit) then SaveToAray:=0 else begin
    Storage[Pos]:=Item^.Inf;
    SaveToAray:=SaveToAray(Item^.Next,Srorage,succ(Pos),Limit)+1;
  end;
end;
Var Buf:TStorage;

Вызывается:
X:=SaveToAray(First,Buf,1,N);

Возвращает количество элементов записанных в массив, начиная с указаной позиции.

Идея, надеюсь понятна: Если не конец списка или массива, то записываем и на рекурсивном спуске переходим к следующему. На подъёме вычисляется количество элементов, путем прибавления единицы.
Svin
Сообщения: 3
Зарегистрирован: 31 мар 2009, 19:04

Огромное спасибо за поддержку в трудную минуту :) .

Отличное решение проблемы! Правда, описание массива в переменных функции - излишне. Возможно я просто не допонимаю его необходимость. Если Вам не составит труда - объясните.
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

Можете убрать, но тогда функция сможет работаь только с одним глобально объявленным массивом. А так ей можно указать любой. Массив данного типа.
Можно пойти еще дальше, и при {$R-} (выключенной проверке выхода за границы диапазона) передавать указатель на массив array[0..0] of. В этом случае можно будет пользоваться любыми массивами, главное, чтобы базовый тип массива совпадал.
Ответить