Newsgroup: it.comp.lang.pascal
Titolo: Esercizio pari e dispari

Prova ad immaginare di avere due contenitori, uno pieno di liquido blu , l'
altro pieno di liquido rosso.......
come faresti a scambiare i contenuti dei due recipienti senza usare un terzo
recipiente???
Io dico che è impossibile =: D
se ci provi solo con due perdi comunque il contenuto di uno dei due
recipienti oppure di entrambi....
quindi ti posso dare un' idea di un algoritmo abbastanza efficiente che mi è
venuto in mente :)))) che usa una variabile "a" di appoggio,
la quale comunque viene distrutta alla fine dell' esecuzione della
procedura.
Supponiamo che tu voglia i pari a sinistra e i dispari a destra:
secondo il mio modesto parere l' algoritmo più conveniente è controllare il
primo elemento......
è pari? SI: rimane dove è e avanzo di una posizione con l' indice I
           NO: comincio a scorrere il vettore con un altro indice J finchè
non trovo un elemento pari; a questo punto incremento I di uno e procedo
Il tutto finchè J non è uguale ad n o n+1(dipende dove metti il controllo).
Provo ad accennarti il codice RICORSIVO:
program Dividi
var i,j:integer;
 vettore=array[1..n]of integer;
procedure PariDspari(i,j:integer)
var a:integer;
begin
 if j<>n+1 then begin
 if (vettore[i] mod 2)=0 then PariDispari(i+1,j)
else begin
 j:=j+1;
 if (vettore[j]mod2)=0 then begin
   a:= vettore[j]mod2;
   vettore[j]:=vettore[i];
   vettore[i]:=a;
   PariDispari(i+1,j);
  end
 else PariDispari(i,j);
end;
end;
end;
begin
i:=1;
j:=2;
PariDispari(i,j);
end.

No, guarda che si può fare... io l'avevo fatto supponendo di avere un array
di '0' e '1' e dover mettere tutti gli '0' prima (a sinistra) di tutti gli
'1'.
procedure esercizio (va X: vettore);
var i, j: integer;
begin
            i:=1; j:=N;
            while i<j do if (X[i]=0) then i:=i+1
                                                 else begin
                                                                    scambia
(X,i,j);
                                                                    j:=j-1
                                                          end;
end;
la procedura 'scambia' non dovresti avere problemi a farla. ciaooo
Steve

beh se hai solo 1 e 0 il problema e' troppo facile :-)
usi una sola variabile per contare gli uno o gli zero
e poi riempi il vettore ricominciando dall'inizio :-)
var
 lungh, n : integer;
begin
 for n := 1 to LENVETT do
  if (vett[n]) then Inc(lungh);
for n := 1 to LENVETT do
 if (n<=lungh) then vett[n] := 1
    else vett[n] := 0;
end;
--
Dreadnaut (dn)
drea...@liberoDALLASPAM.it
(Life would be easier if I had the source code)


E' proprio nella scambia che devi usare una variabile di appoggio......
=:D
Certo con 2 elementi non ce n' è bisogno, ma nel caso dei pari e dispari non
si può fare.
Se leggi bene il mio codice la variabile esiste ed è temporanea, quindi
viene eliminata alla fine della procedura.
CIAO CIAO ^_^

 Io dico che è impossibile =: D
a meno che si non lanci il contenuto nel vuoto
e poi si scambino di posto i contenitori prima
che il fluido vi ricada dentro :) 
a := a + b;
b := a - b;
a := a - b;
--
Ammatwain

 Ammatwain
Hai vermente ragione non ci avevo mai pensato ...... veramente ingegnoso :)
Complimenti.

 wrote:

Grazie! A dire la verita' e' stato l'esempio
che hai fatto che me l'ha fatto immaginare!
--
Ammatwain


Concordo pienamente! Non mi sarebbe mai venuto in mente!
Alex