
28.05.2013, 03:11
|
Прохожий
|
|
Регистрация: 28.05.2013
Сообщения: 2
Версия Delphi: Delphi 7
Репутация: 10
|
|
Каскадная рекурсия
Не понимаю каскадную рекурсию, написал линейную. Помогите переделать в каскадную.
Задание: Для заданного одномерного массива B из N элементов найти значение минимального элемента массива. Рекурсивную функцию применять каждый раз отдельно для каждой из половин массива. Рекурсивные вызовы заканчивать, когда останется только один элемент.
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, Grids, StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Label1: TLabel;
Label2: TLabel;
Button1: TButton;
StringGrid1: TStringGrid;
UpDown1: TUpDown;
Button2: TButton;
procedure FormCreate(Sender: TObject);
procedure Edit1Change(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
type
mas=array of longint;
procedure TForm1.FormCreate(Sender: TObject);
var i: Byte;
begin
StringGrid1.Cells[0,0]:='#';
StringGrid1.Cells[0,1]:='X';
for i:=1 to StringGrid1.ColCount-1 do
StringGrid1.Cells[i,0]:=IntToStr(i);
end;
procedure TForm1.Edit1Change(Sender: TObject);
begin
StringGrid1.ColCount := UpDown1.Position+1; // + один фиксированный столбец
StringGrid1.Cells[UpDown1.Position,0]:=IntToStr(UpDown1.Position); // подписать новый столбец
end;
function minmas(a:mas; n:byte):integer;
var min,x:longint;
begin
min:=a[n];
if n>1 then
begin
x:=minmas(a,n-1);
if min>x then min:=x
end;
minmas:=min;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
a: mas; // массив описанного выше (или в модуле) типа
n,i: byte; //
flag: boolean;
begin
n:=UpDown1.Position;
SetLength(a,n);
flag:=true;
try //ввод массива с проверкой
for i:=1 to n do begin
a[i-1]:=StrToInt(StringGrid1.Cells[i,1]);
end
except // в случае ошибки
flag:=false;
ShowMessage('Некорректное значение '+IntToStr(i)+'-го элемента массива');
end;
if flag then
begin
Label2.Caption:=FloatToStr(minmas(a,n));
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
close;
end;
end.
|