Procedure fast(q, p : integer; var x : t);
var
s, l, r : integer;
begin
l := q; r := p;
s := x[l];
repeat
while (x[r] >= s) and (l < r) do r := r - 1;
x[l] := x[r];
while (x[l] <= s) and (l < r) do l := l + 1;
x[r] := x[l]
until l = r;
x[l] := s;
if q < l - 1 then fast(q, l - 1, x);
if l + 1 < p then fast(l + 1, p, x)
end;
Proseduraning juda muhim xususiyatiga e’tibor bering! Uning asosiy qismi - “o’rta” elementni aniqlash jarayoni bajarilgandan so’ng ikkita shartli operator qo’yilgan:
if q < l - 1 then fast(q, l - 1, x);
if l + 1 < p then fast(l + 1, p, x)
Birnchi shartli operator chapga siljishga “majbur etadi” (buni biz misolda ko’rib chiqqan edik) va huddi o’sha prosedura-fastni chaqiradi, ya’ni o’ziga o’zi murojaat etish jarayoni kuzatiladi. Huddi shu jarayon chapga siljishni ta’minlovchi ikkinchi shartli operatorda kuzatiladi. Bu yerda ham fast prosedurasi- o’zini o’zi chaqiradi. Ya’ni bizda rekursiv prosedura hosil bo’ladi.
Mustaqil yechish uchun vazifalar
Shu prosedura yordamida massivni tartiblashga doir to’la dasturni tuzing va uni bajaring.
197-misol. Tasodifiy sonlar funksiyasi yordamida tuziladigan, so’ngra tezkor tartiblash rekursiv prosedurasi yordamida tartiblanadigan ikkita tartiblangan massivdagi o’xshash elementlar sonini toping.
Program L197;
uses Crt;
const n = 20;
type t = array[1..n] of integer;
var x : t; i : integer;
{----------------------------------------------------------------------------------------}
Procedure create(n : integer; var x : t);
var
i : integer;
begin
randomize;
writeln('Berilgan butun sonli massiv');
Do'stlaringiz bilan baham: |