PDA

View Full Version : [GENERALE] Confronto successione-vettore


Qwertid
24-04-2005, 18:37
Ciao a tutti!

Visto che sono in procinto di dover fare un esame di programmazione sulle prime cose (cicli for, while, array, etc), stavo facendo degli esercizi tipo... Ho un problema con quelli che trattano le successioni... Vi scrivo la traccia ma non voglio la soluzione, vorrei solo una dritta su come risolvere il problema che vi esporrò dopo...

Traccia:

Si consideri la successione:
a1=1
a2=3
a3=4
e per ogni n>3 an=a(n-1)+2*a(n-2)+a(n-3)

Siano dati due array A e B di interi di N elementi. L'array A è ordinato in senso crescente con A[1]>a3. Scrivere una procedura che inserisca in ogni elemento B[i] uno tra i due seguenti valori:

0 se l'elemento appartiene alla successione;
la minima differenza in valore assoluto tra A[i] ed un elemento della successione altrimenti.


La mia domanda è: una volta calcolato il generico an, per vedere se esso è contenuto nell'array devo per forza scorrerlo tutto con un ciclo for ed effettuare il confronto e ripetere questa procedura per ogni an trovato, oppure c'è un metodo più "economico" in termine di risorse? Grazie dell'aiuto :)

P.S: io faccio Turbo Pascal però il problema è a carattere generale credo, indipendente dal linguaggio.

Qwertid
24-04-2005, 19:21
Sono riuscito a giungere a questa soluzione, voi che ne dite?

PROCEDURE CONFRONTA (VAR A,B: VETTORE; N,A1,A2,A3:INTEGER);
VAR
I,AN,J: INTEGER;
BEGIN
I:=1;
AN:=A3+2*A2+A1;
A1:=A2;
A2:=A3;
A3:=AN;
WHILE (A[N]>AN) DO
BEGIN
WHILE (A[I]>AN) DO
BEGIN
AN:=A3+2*A2+A1;
A1:=A2;
A2:=A3;
A3:=AN;
IF A[I]=AN THEN B[I]:=0
ELSE
IF (ABS(AN-A[I])<ABS(A[I]-A2)) THEN B[I]:=ABS(AN-A[I])
ELSE B[I]:=ABS(A[I]-A2);
I:=I+1;
END;
END;
END;