|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Каскадная рекурсия
Не понимаю каскадную рекурсию, написал линейную. Помогите переделать в каскадную.
Задание: Для заданного одномерного массива 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. |
#2
|
|||
|
|||
Цитата:
Подозреваю, что имеется в виду, что у тебя 2 рекурсивных вызова для каждой итерации. что-то типа: Код:
function FindMin(const B : Array Of Integer) : Integer; var B1, B2 : Array Of Integer; I : Integer; begin If Length(B) = 1 Then Result := B[Low(B)] Else Begin SetLength(B1,Length(B) div 2); SetLength(B2,Length(B) - Length(B) div 2); For I := Low(B) To High(B) Do If I <=Length(B1) Then B1[i] := B[i] Else B2[I-Length(B1)] := B[i]; Result := Min(FindMin(B1),FindMin(B2)); SetLength(B1,0); SetLength(B2,0); End; end; |
#3
|
|||
|
|||
Спасибо огромное.
|