Недавно добавленные исходники

•  DeLiKaTeS Tetris (Тетрис)  3 392

•  TDictionary Custom Sort  5 614

•  Fast Watermark Sources  5 368

•  3D Designer  7 799

•  Sik Screen Capture  5 664

•  Patch Maker  6 155

•  Айболит (remote control)  6 168

•  ListBox Drag & Drop  5 049

•  Доска для игры Реверси  93 965

•  Графические эффекты  6 335

•  Рисование по маске  5 385

•  Перетаскивание изображений  4 563

•  Canvas Drawing  4 931

•  Рисование Луны  4 673

•  Поворот изображения  4 213

•  Рисование стержней  2 968

•  Paint on Shape  2 201

•  Генератор кроссвордов  3 048

•  Головоломка Paletto  2 396

•  Теорема Монжа об окружностях  3 175

•  Пазл Numbrix  2 081

•  Заборы и коммивояжеры  2 722

•  Игра HIP  1 703

•  Игра Go (Го)  1 622

•  Симулятор лифта  1 940

•  Программа укладки плитки  1 674

•  Генератор лабиринта  2 105

•  Проверка числового ввода  1 799

•  HEX View  2 057

•  Физический маятник  1 796

 
скрыть


Delphi FAQ - Часто задаваемые вопросы

| Базы данных | Графика и Игры | Интернет и Сети | Компоненты и Классы | Мультимедиа |
| ОС и Железо | Программа и Интерфейс | Рабочий стол | Синтаксис | Технологии | Файловая система |



Delphi Sources

Рекурсия и опережающее описание



Рекурсия - это такой способ организации вычислительного процесса, при котором подпрограмма в ходе выполнения составляющих ее операторов обращается сама к себе.

Рассмотрим классический пример - вычисление факториала. Программа получает от компонента edinput целое число n и выводит в компонент lboutput значение N!, которое вычисляется с помощью рекурсивной функции Factorial.

При выполнении правильно организованной рекурсивной подпрограммы осуществляется многократный переход от некоторого текущего уровня организации алгоритма к нижнему уровню последовательно до тех пор, пока, наконец, не будет получено тривиальное решение поставленной задачи. В нашем случае решение при n = 0 тривиально и используется для остановки рекурсии.

procedure TfmExample.bbRunClick(Sender: TObject);
  function Factorial(N: Word): Extended;
  begin
    if N = 0 then
      Result: = 1 else
      Result := N * Factorial(N - 1)
  end;
var
  N: Integer;
begin
  try
    N := StrToInt(Trim(edinput.Text));
  except
    Exit; end;
  IbOutput.Caption := FloatToStr(Factorial(N))
end;

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

Рекурсивный вызов может быть косвенным. В этом случае подпрограмма обращается к себе опосредованно, путем вызова другой подпрограммы, в которой содержится обращение к первой, например:

procedure A(i: Byte);
begin
  В(i);
end;

procedure В(j: Byte);
begin
  а(j);
end;

Если строго следовать правилу, согласно которому каждый идентификатор перед употреблением должен быть описан, то такую программную конструкцию использовать нельзя. Чтобы такого рода вызовы стали возможны, вводится опережающее описание:

procedure В(j: Byte); forward;

procedure A(i: Byte);
begin
  В(i);
end;

procedure B; begin
  A(j);
end;

Как видим, опережающее описание заключается в том, что объявляется лишь заголовок процедуры в, а ее тело заменяется стандартной директивой Forward. Теперь в процедуре а можно использовать обращение к процедуре в - ведь она уже описана, точнее, известны ее формальные параметры, и компилятор может правильным образом организовать ее вызов. Обратите внимание: тело процедуры в начинается заголовком, в котором уже не указываются описанные ранее формальные параметры.








Copyright © 2004-2025 "Delphi Sources" by BrokenByte Software. Delphi World FAQ

Группа ВКонтакте