Perché sono necessari i loop? [duplicare]

-4
    

Questa domanda ha già una risposta qui:

    

Mi sembra che un ciclo while con le appropriate istruzioni break possa sostituirli completamente. Capisco che un'istruzione break possa non sembrare "liscia" come un ciclo for che fa qualcosa un determinato numero di volte, ma sento anche che la ridondanza nel loro comportamento non è necessaria.

    
posta Dick Lucas 30.09.2014 - 02:54
fonte

4 risposte

4

Sospetto che parte della risposta sia che rende l'ottimizzazione del compilatore più facile, e in parte perché, per alcune varianti di codice, è più semplice per un essere umano leggere una semplice struttura "per" che cercare una frase break.

Il codice leggibile / manutenibile e il codice ottimizzabile del compilatore è più importante delle considerazioni sulla ridondanza funzionale nella progettazione del linguaggio - dopo tutto, dove ti fermi, puoi scrivere la lingua con una singola struttura di controllo del flusso (pensa a un completo di Turing linguaggio basato su una "mossa" dalla funzione predefinita per funzionare in un elenco che scoppia in modo simile a un singolo linguaggio della macchina di istruzioni), ma nessuno vorrebbe usarlo.

    
risposta data 30.09.2014 - 03:04
fonte
5

I loop sono necessari perché esprimono al meglio l'intento dei programmatori. Ecco perché la maggior parte delle lingue ha diversi tipi di loop.

Escludendo lingue come BrainFuck, il punto della maggior parte della sintassi dei linguaggi è per rendere più facile esprimere l'intento dei programmatori. Altrimenti rimarremmo tutti con il codice macine perfettamente funzionante.

    
risposta data 30.09.2014 - 04:54
fonte
5

Ciò che è più leggibile e mantenibile è il modo corretto di fare la maggior parte delle cose.

Explicit is better than implicit.

Esempi di codice pseudo:

for (int i=0; i < 10; i++) { /* do something 10 times */ }

for i in range(1,10): # do something 10 times

// assume range is a list, set, vector, array or iterable something
for (final int i : range) { /* do something 10 times */ }

vs

int i = 0;
while (i < 10) { /* do something 10 times */ i++; }

che è solo zucchero sintattico per e non molto meglio di:

int i = 0;
loop:
    if (i < 10) { /* do something */ } else { goto end; }
    i++; goto loop;
end:
  1. Quale ti dice immediatamente cosa sta succedendo?

  2. Che cosa accade se qualcuno sposta i++ nella versione while ?

  3. cosa succede se qualcuno dimentica il i++ nella versione while ?

  4. Quale ha una migliore localizzazione e coesione ( suggerisci che è la versione per )

  5. la versione while ha uno stato mutabile che non rientra nell'ambito del ciclo!

Ancora meglio sono le lingue, per lo più funzionali, che supportano la corrispondenza dei pattern come Erlang

Ecco lo pseudo codice per una versione di corrispondenza del modello.

function for(n) { /* do something */ for(n--); }
function for(0) { /* do something the last time*/ }

La maggior parte del ciclo si trova su una specie di raccolta

Il Visitor Pattern è molto più espressivo e presenta un'elevata coesione e un basso accoppiamento.

Ecco un buon esempio in Python con una spiegazione approfondita del perché è così potente.

    
risposta data 30.09.2014 - 05:04
fonte
1

Una regola empirica spesso insegnata nelle classi di programmazione e un modo generalmente utile per pensarci, è questa:

Se non sei sicuro di quante volte può essere eseguito un ciclo (potrebbe essere una volta o cento volte, come quando si cerca qualcosa in un albero), usa while() .

Se puoi definire con precisione quante volte verrà eseguito un ciclo, ad esempio 10 volte, o su un intervallo di elementi impostato (come i primi n elementi di un elenco), utilizza for() .

In senso stretto, non hai bisogno di cicli o while in qualsiasi lingua che ha goto o più volte eseguito con main metodo.

Anche i cicli

while hanno la discutibile distinzione di essere probabilmente la fonte più comune di bug infiniti nei moderni linguaggi di programmazione e tendono ad espandere l'ambito corrente con variabili iteratore non necessarie a meno che non si usi una chiusura (e un linguaggio che supporta le chiusure, ovviamente). Per i principianti, possono essere un vero dolore.

Per i programmatori esperti, è meglio comprendere gli idiomi della lingua e ciò che ogni tipo di loop è comunemente inteso per rappresentare, e per evitare le innumerevoli preferenze personali su ogni problema se il codice è inteso in ultima analisi per le altre persone consumo.

I, all'opposto, preferisco for e foreach o for-range (nelle lingue che li hanno) e devo forzarmi a usare while loops quando sembrano più appropriati.

Non è necessario che sia una cosa religiosa: basta imparare l'uso di tutti gli elementi basilari del linguaggio e, in particolare, tutti i più fini dettagli delle strutture di controllo, e scoprirai che è il momento ben speso.

    
risposta data 30.09.2014 - 06:48
fonte

Leggi altre domande sui tag