Помощь - Поиск - Пользователи - Календарь
Полная версия: поиск методом половинного деления(рекурсия)
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
anonim
ни кто не хочет алгорит поиска делением пополам преобразовать из простого в рекурсивный????буду очень благодарен
Код

program dsfsdf;
uses crt;
type mas=array[1..10] of integer;
var  n,j:integer;a:mas; x:integer;i:integer;
function dixotom(a:mas;x:integer;var i:integer):boolean;
  var l,r,m:integer;
  begin
   l:=1;r:=n;
    repeat
     m:=(l+r) div 2;
     if a[m]<x
      then l:=m+1
      else r:=m-1;
   until (a[m]=x) or (l>r);
   dixotom:=a[m]=x;i:=m;
  end;
  begin   clrscr;
   writeln('введите длину массива');
   readln(n);
    for j:=1 to n do
    read(a[j]);
    writeln('введите элемент x');
    readln(x);

   if dixotom(a,x,i)=true
    then writeln('элемент найден ',i)
    else writeln('не найден');  readkey;
end.
volvo
А зачем тебе ИЗ ЭТОГО рекурсию делать? При больших размерах массива будут проблемы - стек не резиновый...
uses crt;

const
n = 10;
type
mas = array[1 .. n] of integer;
var
x: integer;

function dix(const a: mas; left, right: integer;
var i: integer): boolean;
var m: integer;
begin
dix := false; i := 0;
m := (left + right) div 2;
if (left > right) or (a[m] = x) then begin

dix := (a[m] = x);
i := m; exit;

end
else
if a[m] < x then dix := dix(a, m + 1, right, i)
else dix := dix(a, left, m - 1, i);

end;

var
i: integer;
const
a: mas = (
1, 3, 5, 6, 7, 9, 12, 15, 19, 24
);
begin
clrscr;

write('x = '); readln(x);
if dix(a, 1, n, i) then writeln('i = ', i)
else writeln('not found');

readkey;
end.
anonim
Спасибо..блин я был почти близок....тока 1 косяк сделал....я не знаю зачем тут рекурсией.....помоему в быстроте выполнения не ахти какая разница..просто сказали сделать....
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.