Читать онлайн «Рекурсия»

Автор Юрий Карпов

Annotation

Книга предназначена студенту, писавшему программы только в качестве курсовых, "сдавшему" Delphi и несмотря на это, желающему стать программистом. Это, не сборник готовых рецептов, автор хочет поставить читателя в условия максимально приближенные к рабочим. Мы вместе напишем программу, пройдя через ошибки, и сомнения к окончательной победе...

Рекурсия

notes

1

Рекурсия

|t_| Доброго времени суток!

|go| Готов с вниманием внимать,

все то, что ты, zz сказать.

(переменная zz пока не определена).

|t_| Давай присвоим zz := 'хотел'.

Напомню, сегодня, наша тема - рекурсия.

|go| Я посмотрел, что говорит на эту тему википедия - что-то уж очень закручено... но вообще-то мы такое проходили... Фотография: мужик смотрит на фотографию на ней он же смотрит на туже фотографию, на ней...

|t_| Уже легче. Давай использовать облегченное определение. Рекурсия, это когда внутри процедуры (функции) есть вызов ее самой:

procedure МояПроцедура(параметры);

begin

...

что-то там делается

...

if условие потребности в рекурсии

then МояПроцедура(параметры);

...

и еще что ни будь сделаем

...

end;

Условие потребности в рекурсии, рано или поздно должно стать false иначе она станет бесконечной и программа зависнет. Возможен и такой вариант:

function МояФункция(параметры):boolean;

begin

...

что-то там делается

...

if МояФункция(параметры)

then exit;

...

result := условие выхода из рекурсии

...

end;

Конечно же, возможны сотни других вариантов...

Надеюсь, что не очень напряг тебя теорией, теперь к практике.

|go| Да нет, все нормально. Поехали.

:(

Yes no,

all OK.

Let's go.

:)

|t_| Сегодня у тебя поэтическое настроение, это хорошо...

Рекурсия очень хорошо подходит для обхода дерева, например дерева файловой системы.

Задача.

Написать программку удаляющую все пустые папки в заданной папке ( устройстве ).

(готовый исходник можно извлечь из этой книги, и имя его del_empty_dir. zip1 )

Давай сделаем простенькую форму с одной только кнопочкой.

При нажатии должен появляться диалог выбора папки, и после этого просмотрим все входящие папки и удалим пустые. Да еще, посчитаем удаленные и сообщим результат.

|go| Ну, что делаем новый проект в новой папке?

|t_| Да, как всегда.

На форме одну кнопочку, и вот обработчик ее клика и все остальное.

Давай, попробуй выполнить программку, создай пустую папку и попробуй ее удалить.

А потом обсудим.

// начало кода

{ 0 } var

{ 1 } Form1: TForm1;

{ 2 } Path : AnsiString; // путь к папке с программой

{ 3 } count : integer; // счетчик удалений

{ 4 }

{ 5 } implementation

{ 6 }

{ 7 } {$R *. dfm}

{ 8 }

{ 9 } function DelEmtyDir(Target : AnsiString):boolean;

{ 10 } var

{ 11 } Found : integer; // результат поиска ( 0 - файл найден )

{ 12 } SR : TSearchRec; // запись с параметрами файла

{ 13 } begin

{ 14 } Found := FindFirst(Target + '\*. *',$3F,SR);

{ 15 } result := true; // предположим что папка пуста.

{ 16 } WHILE Found = 0 DO

{ 17 } BEGIN

{ 18 } if (SR. Name <> '. ')

{ 19 } and (SR. Name <> '. . ')

{ 20 } then

{ 21 } begin

{ 22 } // если это папка

{ 23 } if ((SR. Attr and $10) = $10 ) then