Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 13.05.2013, 15:52
Kehl Kehl вне форума
Прохожий
 
Регистрация: 13.05.2013
Сообщения: 1
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Помогите пожалуйста написать рекурсивную проц-ру

Дан список целых чисел. Удалить все элементы после ноля.
Ответить с цитированием
  #2  
Старый 13.05.2013, 23:55
Snake22 Snake22 вне форума
Активный
 
Регистрация: 20.02.2011
Сообщения: 374
Репутация: 744
По умолчанию

Код:
for i:= 0 to Length(Spisok)-1 do
begin
if spisok[i]=0 then 
  begin
  newLength:=i;
  Break;
  end;
end;
SetLength(Spisok, newLength);
Ответить с цитированием
  #3  
Старый 14.05.2013, 06:53
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,035
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Snake22, умный, да
Список же дан

Ладно, я сегодня добрый.
Код:
type
  PItem = ^TItem;
  TItem = record
    Value : Integer;
    Next : PItem;
  End;

// Вариант 1. Находим нужный элемент, после чего хвост удаляем
procedure DeleteAfterZero1(AHead : PItem);
var
  ATail : PItem;
begin
  If AHead <> Nil Then
    If AHead.Value = 0 
      Then  
        Begin
           ATail := AHead.Next;
           AHead.Next := Nil;
           // Здеся циклом, хотя можно тоже сделать рекурсию
           While ATail <> Nil Do
             Begin
               AHead := ATail.Next;
               Delete(ATail);
               ATail := AHead;
             End;
        End
      Else DeleteAfterZero1(AHead.Next);
end;

// Вариант 2. Находим нужный элемент, после чего хвост удаляем рекурсивно
procedure DeleteAfterZero2(AHead : PItem; IsDelete : Boolean = Fasle);
var
  ATail : PItem;
begin
  If AHead <> Nil Then
    If IsDelete 
      Then
        Begin
          ATail := AHead.Next;
          Delete(ATail);
          DeleteAfterZero2(ATail,IsDelete);
        End
      Else
        Begin
          If AHead.Value = 0
            Then
               Begin
                  ATail := AHead.Next;
                  AHead.Next := Nil;
                  DeleteAfterZero2(ATail,True);
               End
            Else DeleteAfterZero2(AHead.Next,IsDelete);
        End;
end;
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 06:10.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter