Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Рекурсивная обработка вектора

Автор: Rattter 10.12.2006 18:08

Помогите задачку решить...

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

А, если |A|=1, т.е. длина вектора =1
Ф(А)= ab, если |A|=2, A=ab, a<=b
ba, если |A|=2, A=ab, b<a
Ф(B)Ф©, если |A|>2, A=BC, |B|=|C| или |B|=|C|+1

Упс! Условия неправильно записались. Извиняюсь, пишу еще раз...

Ф(А)= А, если |A|=1, т.е. длина вектора =1;
Ф(А)= ab, если |A|=2, A=ab, a<=b
Ф(A)= ba, если |A|=2, A=ab, b<a
Ф(A)= Ф(B)Ф©, если |A|>2, A=BC, |B|=|C| или |B|=|C|+1

Автор: мисс_граффити 10.12.2006 18:34

что ты пробовал делать?
показывай.

Автор: Rattter 10.12.2006 21:11


procedure Recurs(var V: Vector; First,Last,Size: Byte);
var
Element: Word;
Center: Byte;
CurrentSize: Byte;
begin
CurrentSize:=Last-First+1;
Center:=CurrentSize div 2+1;
if CurrentSize>1 then
if CurrentSize=2 then begin
if V[First]>V[Last] then begin // Замена на возрастание
Element:=V[Last];
V[Last]:=V[First];
V[First]:=Element;
end;
end
else begin
Recurs(V,First,Last div 2,Size);
Recurs(V,Center,Last div 2,Size);
end;
end;


Вот. Но это все не работает, к сожалению. Я даже не знаю, как правильно написать, чтобы при делении вектора обрабатывалась и левая часть и правая часть.

Автор: Алена 10.12.2006 21:39

Rattter, тесты какие-нибудь есть? На массиве <1, 2, 3, 4, 5, 3, 4, 7, 8, 2> что должно выдавать, например?

У меня выдает < 1 2 3 4 3 4 5 7 2 8>

Автор: Rattter 11.12.2006 22:01

Например, на векторе 2,1,3,4,6,5,7 должно быть следующее:

F(2,1,3,4,6,5,7)=F(2,1,3,4)F(6,5,7)=F(2,1)F(3,4)F(6,5)F(7)=1,2,3,4,5,6,7

Автор: volvo 11.12.2006 22:09

Это тебе Алена передала:

const
sz = 7;
type
vector = array[1 .. sz] of integer;
const
a: vector = (2, 1, 3, 4, 6, 5, 7);

procedure Recurs(var V: Vector; First, Last: Byte);
var
Element: Word;
size, Center: Byte;
begin
size := (last - first + 1);
if size = 1 then exit;

Center:= first + (size div 2);
if Size <= 2 then begin

if V[First]>V[Last] then begin
Element:=V[Last]; V[Last]:=V[First]; V[First]:=Element;
end

end
else begin
Recurs(V,First,center);
Recurs(V,Center,Last);
end;

end;

var i: integer;
begin
recurs(a, 1, sz);
for i := 1 to sz do write(a[i]:4);
writeln;
end.

Автор: Rattter 12.12.2006 1:33

Спасибо, Алена!!! Не поверишь, но у меня буквально перед прочтением этой страницы родилась-таки идея. Написал почти тоже самое, что и ты. Но всер равно спасибо за участие!!!