Program RekursivBinaer(input,output); {Markus Schaber, Bl6 Aufg 4}
CONST   Anzahl=1000; {Anzahl der Felder, die zu durchsuchen sind.}
        Nicht =-1;   {Rckgabewert, wenn Zahl nicht gefunden}

TYPE    TArray = ARRAY [1..Anzahl] OF INTEGER;

VAR     MeinFeld: TArray;

Procedure InitArray(VAR Feld:TArray);
{Fllt ein Array mit Aufsteigenden Zahlen variierenden Abstands}
VAR i,j:INTEGER;
BEGIN
     j:=0;
     Feld[1]:=-42; {Die kleinste Zahl im Feld}
     FOR i:=2 TO Anzahl DO BEGIN
           Feld[i]:=Feld[i-1]+j;
           j:=(j+1)MOD 4;
     END;
END;

FUNCTION SucheZahl(Zahl: Integer; MeinFeld: TArray):INTEGER;
{Sucht Zahl im Feld TArray und gibt Fundstelle zurck}
VAR    unten,oben:INTEGER;
FUNCTION InnereSuche(unten,oben:INTEGER):INTEGER;
VAR    position: INTEGER;
BEGIN
     position:=(unten+oben) DIV 2;
     IF unten>oben THEN
        InnereSuche:=Nicht
     ELSE IF MeinFeld[position]=Zahl THEN
        InnereSuche:=position
     ELSE IF MeinFeld[position]>Zahl THEN
        InnereSuche:=InnereSuche(unten,position-1)
     ELSE
        InnereSuche:=InnereSuche(position+1,oben);
END;
BEGIN
     SucheZahl:=InnereSuche(1,Anzahl);
END;


BEGIN
     InitArray(MeinFeld);
     WriteLn('Ich suche die Zahlen...');
     WriteLn(SucheZahl(  -100,MeinFeld));
     WriteLn(SucheZahl(   -42,MeinFeld));
     WriteLn(SucheZahl(     0,MeinFeld));
     WriteLn(SucheZahl(     1,MeinFeld));
     WriteLn(SucheZahl(     2,MeinFeld));
     WriteLn(Suchezahl(   255,MeinFeld));
     WriteLn(SucheZahl(MAXINT,MeinFeld));
END
.