[Java]
Buon giorno
,
ho svolto il seguente esercizio:
Io ho programma in questo modo
mentre la soluzione proposta è la seguente:
La differenza sta nel metodo ausiliario in cui io ho usato for
al posto di while
I due metodi si equivalgono oppure è preveribile usare while e perchè? Inoltre nella condizione di "while" non capisco perché sia necessario mettere !pariNeg (dove pariNeg è stato inizializzato con valore falso).

ho svolto il seguente esercizio:
Si vuole risolvere il seguente problema. Data una sequenza di interi, verificare se esiste una tripla di interi consecutivi nella sequenza che contiene almeno un intero pari ed almeno un intero negativo.
Io ho programma in questo modo
mentre la soluzione proposta è la seguente:
La differenza sta nel metodo ausiliario in cui io ho usato for
boolean esistono = false; for(int i=0; i<=interi.length-3; i++) if( (interi[i] %2 == 0 || interi[i+1] %2 == 0 || interi[i+2] %2 == 0 ) && (interi[i] <0 || interi[i+1] <0 || interi[i+2] <0 ) ) esistono = true; return esistono;
al posto di while
/* guarda tutte le triple */ i=0; while(i<= seq.length-3 && !pariNeg) /* tripla corrente soddisfa la proprietà? */ if((seq[i] % 2 == 0 || seq[i+1] % 2 == 0 || seq[i+2] % 2 == 0) && (seq[i] < 0 || seq[i+1] < 0 || seq[i+2] < 0)) pariNeg = true; else i++; return pariNeg;
I due metodi si equivalgono oppure è preveribile usare while e perchè? Inoltre nella condizione di "while" non capisco perché sia necessario mettere !pariNeg (dove pariNeg è stato inizializzato con valore falso).
Risposte
Nella soluzione con il while, il ciclo termina non appena viene trovata una tripla che soddisfa i requisiti. Nella soluzione con il for, invece, il ciclo visita sempre tutta la lista.
Dal punto di vista semantico sono equivalenti, però la soluzione con il while potrebbe essere più veloce. Nella stragrande maggioranza dei casi la differenza è troppo piccola per essere misurabile. Inoltre si tratta di una micro-ottimizzazione che non cambia la complessità della funzione, che rimane lineare.
In generale, i cicli for e while sono equivalenti. Però, dal punto di vista idiomatico, il ciclo for viene usato quando si conosce a priori il numero di iterazioni (ad esempio quando si scorre un'intera sequenza), mentre il ciclo while viene usato quando la condizione di uscita può cambiare durante un'iterazione.
Ad esempio, puoi aggiungere la stessa condizione usata nella soluzione proposta nel tuo ciclo for:
Dal punto di vista semantico sono equivalenti, però la soluzione con il while potrebbe essere più veloce. Nella stragrande maggioranza dei casi la differenza è troppo piccola per essere misurabile. Inoltre si tratta di una micro-ottimizzazione che non cambia la complessità della funzione, che rimane lineare.
In generale, i cicli for e while sono equivalenti. Però, dal punto di vista idiomatico, il ciclo for viene usato quando si conosce a priori il numero di iterazioni (ad esempio quando si scorre un'intera sequenza), mentre il ciclo while viene usato quando la condizione di uscita può cambiare durante un'iterazione.
Ad esempio, puoi aggiungere la stessa condizione usata nella soluzione proposta nel tuo ciclo for:
for(int i=0; i<=interi.length-3 && !esistono; i++)
Ti ringrazio per la risposta!
In pratica appena è stata trovata la tripla richiesta, il ciclo termina per la presenza del valore " … && false "

