while terminar sentencia ejercicios ejemplos como ciclo bucle loops coding-style control-flow

loops - terminar - ejercicios while python



¿Por qué usar un bucle for en lugar de un bucle while? (28)

¿Por qué elegir Coca Cola sobre Pepsi?

Entre un ciclo WHILE y FOR, puede usarlos indistintamente. Para ser un purista, podría tomar su decisión basada en la naturaleza de las condiciones. Si está realizando un bucle basado en recuento, entonces un bucle FOR tiene más sentido.

for( cur = 0; cur < myList.Length; cur++ ){ doSomething( myList[cur] ); }

Si está ejecutando un bucle basado en lógica, entonces un WHILE haría la implementación más limpia

Iterator i = myObject.getIterator(); while( i.hasNext() ){ doSomething( i.next() ); }

Posibles duplicados:
Itera con for loop o while loop?
Loops en C - for () o while () - ¿cuál es BEST?

¿Cuándo se debe usar un ciclo for lugar de un ciclo while?

Creo que los siguientes bucles son idénticos, a excepción de su sintaxis. Si es así, ¿por qué elegir uno sobre el otro?

int i; for (i = 0; i < arr.length; i++) { // do work } int i = 0; while (i < arr.length) { // do work i++; }


Como dices, las razones son semánticas y estéticas, en lugar de rendimiento (su código compilado tiende a ser muy similar).

Dicho esto, for es habitual en ciclos que tienen un número conocido de iteraciones, mientras while implica que la condición no está necesariamente correlacionada con lo que estás haciendo dentro del ciclo, o que no sabes al principio cuántas iteraciones habrá.


Como profesor, he estado reflexionando sobre esto en varias formas y formas; mi sugerencia siempre se reduce a

  • for -los bucles son para contar. contando, contando hacia abajo.
  • while construcciones while / do-while son para todas las demás condiciones. c!=EOF , diff<0.02 , etc. Iterators / Enumerators son contadores muy adecuados para for-loops.

es decir, tu int=0; while( ... ) int=0; while( ... ) es horrible para mis ojos.


Curiosidades relacionadas:

En el nuevo lenguaje Go de Google, han decidido no incluir la declaración while . En su lugar, le permiten escribir una declaración for que solo tiene la cláusula de condición. Entonces el equivalente de

while (a < b) { ... }

es simple

for a < b { ... }


Echando un vistazo a las otras (muy buenas) respuestas, hay un punto que no veo que se haga. (Si se hizo, lo extrañé y me disculpo).

Voy a darte dos fragmentos de código aparentemente semánticamente idéntico.

Fragmento n. ° 1:

for (int a = 0; a < arr.length; a++) { /* do some work here */ }

Fragmento n.º 2:

int b = 0; while (b < arr.length) { // do work b++; }

Parece que hacen lo mismo, ¿verdad? Ahora déjame agregar una sola línea a cada fragmento y veamos qué sucede:

Fragmento n. ° 3:

for (int c = 0; c < arr.length; c++) { /* do some work here */ } printf("%d/n", c);

Fragmento n.º 4:

int d = 0; while (d < arr.length) { // do work d++; } printf("%d/n", d);

Así que cuando compilo un archivo basura con esos cuatro fragmentos incrustados (más algo de pegamento para que arr.length signifique algo) aparece el siguiente error:

$ clang junk.c junk.c:20:17: error: use of undeclared identifier ''c'' printf("%d/n", c); ^ 1 diagnostic generated.

Usando el bucle for , resulta que le permite proporcionar más localidad a sus variables de contador ficticias, etc. Esto le da mayor margen de maniobra para reutilizar nombres de variables sin posibilidad de colisión (aunque a costa de aumentar el sombreado potencial).



En general, siempre prefiero los bucles, incluso en los casos en que el bucle no tiene nada que ver con el conteo, ya que localiza el mantenimiento del bucle en una sola ubicación. Cuando aparece otra persona y decide agregar / modificar el ciclo, si está utilizando un ciclo FOR, la persona que realiza la modificación generalmente puede estar segura de eso, siempre y cuando no se meta con elementos dentro de la (s) expresión (es) FOR. , no van a romper la iteración en el ciclo.

Sin embargo, algo así como un bucle while requiere que el programador analice por completo el cuerpo del bucle, y comprenda cómo itera, para asegurarse de que mantienen el código de mantenimiento del bucle sin modificaciones y en el orden correcto cuando realizan cambios.

Por lo tanto, solo uso MIENTRAS en casos donde solo necesito efectivamente la parte media de FOR.


En los primeros tiempos de la programación, una estructura de datos predominante era la matriz lineal (también conocida como vector) y un patrón repetitivo era recorrer y usar cada elemento de la matriz. Este escenario era tan habitual que los lenguajes incluían una sintaxis específica para este patrón: el ciclo for. Aparte de este patrimonio histórico, podrías usar el ciclo while bien (bueno, hoy en día, con lenguajes funcionales como F #, prefieres usar List.map o List.fold ;-)


En su caso, no gana mucho además de una línea menos de código en el ciclo for .

Sin embargo, si declara el bucle así:

for(int i = 0; i < x; i++)

Usted logra mantener i dentro del alcance del ciclo, en lugar de dejar que escape al resto del código.

Además, en un ciclo while, tiene la declaración de variable, la condición y el incremento en 3 lugares diferentes. Con el bucle for, todo está en un lugar conveniente y fácil de leer.

Último pensamiento:
Una nota más importante. Hay una diferencia semántica entre los dos. Mientras que los bucles, en general, están destinados a tener un número indefinido de iteraciones. (es decir, hasta que se haya leído el archivo ... no importa cuántas líneas contenga), y para los bucles debería tener un número más definido de iteraciones. (recorra todos los elementos de una colección, que podemos contar en función del tamaño de la colección).


En un lenguaje como Pascal, durante y mientras los constructos tenían diferentes aplicaciones. Debería escribir un ciclo for en Pascal de la siguiente manera:

for i := 1 to 5 do begin { some code here } end

Por lo tanto, declara explícitamente que i se incrementa en 1. No hay una condición de terminación explícitamente especificada aquí. Por lo tanto, podría utilizar un bucle for solo en los lugares donde sepa que el bucle se ejecutará durante un determinado número predeterminado de veces antes de que comience la ejecución real del bucle. Por otro lado, puede especificar una condición de terminación explícita en el caso de un ciclo while.

i:=0; while (i<>5) do begin { some code here } i:=i+1; end

Por lo tanto, un ciclo while es mucho más flexible. Más tarde, cuando se desarrolló C, aunque se admitía el uso de while y while, el significado del constructo for cambió y se puede agregar en condiciones de terminación explícita utilizando operadores booleanos. Por lo tanto, el poder de while y for en los lenguajes C y C es el mismo y, por lo tanto, se convierte más en un problema de legibilidad que en un problema de usabilidad.


Es principalmente un problema de legibilidad. Generalmente, use para bucles cuando tiene un rango de valores definido para iterar. Use ciclos while cuando no está iterando, o no sabe cuándo se cumplirá su condición de salida.

Desde una perspectiva java, encuentro bucles muy útiles para las colecciones:

for (Object o : objects){ o.process(); }

es mucho más fácil de leer que:

int i=0; while(i < objects.size()){ objects.get(i).process(); i++; }


Es solo mi lógica que generalmente utilizamos para bucle cuando sabemos el recuento exacto de nuestras iteraciones y usamos un ciclo while cuando generalmente queremos verificar una condición. Luego las usamos según sus requisitos. De lo contrario, ambos muestran el mismo comportamiento.


Hay una diferencia semántica entre los bucles for y while. Con bucles for , el número de iteraciones está predefinido, mientras que con while no es necesario.

Algunos lenguajes (como Ada) imponen esto haciendo que el contador de bucle for una constante dentro del cuerpo del bucle. Por lo tanto, sería ilegal decir, por ejemplo:

for i in values''range loop ... i := i + 1; -- this is illegal, as i is a constant within the loop body end if;

Sin embargo, esta diferencia semántica no es tan clara en la mayoría de los lenguajes, que no tratan el contador de bucle for como una constante.


Hay una razón para elegir for más while : Legibilidad.

Al utilizar un bucle for , expresamente dice que su intención es realizar algún tipo de operación que requiera una inicialización, una operación de "paso" y una condición de finalización.

Con el while , por otro lado, solo dice que necesita la condición de finalización.


La única diferencia notable entre un bucle for () y while () es que una instrucción "continuar" en un bucle while () se bifurcará a la parte superior del bucle, mientras que una en un bucle for () se bifurcará a la tercera parte de la cláusula for () [la que está después de la condición, generalmente utilizada para topar variables].


La legibilidad es un punto muy importante, pero funciona en ambos sentidos. Convertiré un for-loop en un while-loop -incluso cuando estoy usando una variable de contador o de lo contrario sería "natural" usarlo-cuando es más legible de esa manera. Esto es común cuando tienes una expresión larga o compleja en cualquiera de las tres partes o múltiples contadores de for (lo que se relaciona con ser complejo).

El loop-and-half de Knuth también funciona mejor, en varios idiomas, como un bucle infinito con un salto, en lugar de un ciclo for-loop.

Sin embargo, hay una diferencia semántica muy importante:

for (int i = 0; i < arr.length; i++) { if (filter(arr[i])) continue; use(arr[i]); } int i = 0; while (i < arr.length) { if (filter(arr[i])) continue; use(arr[i]); i++; }


Legibilidad. Y desde el viejo VB 6 días de Wend cada vez que veo un rato quiero llorar.

Hay algunos casos en los que los bucles son buenos de usar. Llamar a una función en un objeto que devuelve verdadero / falso pero itera un valor dentro de ese objeto.

Ejemplo de ser un DataReader en C #:

List<string> strings = new List<string>(); while(DataReader.Read()) { strings.Add(DataReader["foo"].ToString()); }

Un bucle for le permite encapsular su trabajo dentro de una función, lo que brinda una mejor administración de la memoria. Además, si hay un error en su ciclo while, podría entrar en espiral en un bucle fuera de control que amenaza toda la vida:

bool keepGoing = true; while(keepgoing) { try { //something here that causes exception, fails to set keepGoing = false; keepGoing = false; } catch(Exception) { //Do something, but forget to set keepGoing. //maybe there is always an exception... } }

También creo que es solo una práctica general. Al igual que en la construcción. Usas clavos para colocar pisos de techo en los postes. Podrías "usar" tornillos, harían el mismo trabajo, pero no es una práctica común.

Nadie dice que está mal, solo decimos "doblar bajo la presión de tus compañeros para mantener el mundo de la codificación funcionando".


Para los bucles a menudo son más fáciles de paralelizar. Dado que el programa puede decir con anticipación el número de iteraciones que se realizarán y el valor del iterador en cualquier punto, la paralelización utilizando una API como OpenMP es trivial. Por supuesto, si te metes en pausas, continúa y cambias el iterador manualmente, esta ventaja desaparece.


Por lo general, se compilan para obtener el mismo resultado final. Prefiero for''s o for-each la mayor parte del tiempo. Escritura

for (;x<5;x++){ //do work }

no es tan siniestro, pero escribir

while(x<5){ x++ //do work }

en lugar de

while(x<5){ //do work x++ }

podría confundir a algunas personas y causar errores uno a uno.


Preferencia. Para mí, toda la lógica de bucle está incorporada en la declaración for, por lo que no tiene que declarar la variable de contador o hacer las operaciones de incremento / disminución en el bucle real. Además, puede declarar el contador / índice local a la instrucción for.


Simplemente elija uno y luego cópielo y péguelo en sus proyectos. Menos decisiones, menos tipeo, codificación más rápida. Diferencia de rendimiento insignificante.

Además, no estoy con Justin manteniéndome en el alcance del ciclo, Y uso var aL = array.length fuera del ciclo también. Luego use i y aL dentro del constructor de bucle for para que no esté recalculando la longitud de la matriz en cada hit (junto con una creación de var una y otra vez;)). Nuevamente neg. rendimiento realmente (vea el primer fragmento de mi respuesta), a menos que tenga matrices muy grandes volando alrededor. Si por casualidad usted conoce la longitud de la matriz inicial, primero debe iniciarla con su longitud fija (una pequeña ayuda con la asignación de memoria en los navegadores maliciosos;) si esto es del lado del cliente y usted tiene una gran cantidad de datos).

js ejemplo

<script> var i=0; var myArray = ["D","R","Y"];//literal style will do for now;) var aL=myArray.length; //or use 3 if known upfront for(i;i<aL;i++){/*always do DRY things here*/} </script>

Además, asegúrese de que cuando se cumple una condición, pregúntese: "¿Todavía necesito completar todo el ciclo?" Si no, no te olvides de salir del circuito tan pronto como puedas.


Simplemente pon:

Un bucle ''for'' tiende a ser utilizado para uso iterativo. Necesita iterar a través de una matriz, necesita los números del 1 al 100 (u otros rangos) por varias razones.

Un bucle ''while'' tiende a ser un bucle condicional. Desea seguir haciendo algo hasta que una contición sea falsa. Asumiendo que tienes una clase llamada ''Toast'' y querías cocinar la tostada hasta que esté tostada, tendrías algo como lo siguiente:

while (!toast.isToasted) cook(toast);

Siempre se puede (no puedo pensar en un ejemplo donde no se puede) escribir un bucle for como un bucle while y un bucle while como un bucle for, pero escoger el que mejor primero la situación generalmente se reduce a mi puntos anteriores


Son funcionalmente idénticos, sin embargo, se puede argumentar que el bucle for es menos propenso a errores, porque todas las funciones de bucle están ahí juntas. si tiene varias líneas que separan la declaración de i, la declaración while y el iterador de índice, puede olvidar o confundirse por cómo se usa. Esto es todo subjetivo, por supuesto.


Un ciclo while, definido como

while(condition)

representa este patrón de programación:

1: if(!condition) goto 2; ... goto 1; 2:

Mientras que un bucle for, definido como

for(var i = seed; condition; operation)

representa este patrón:

var i = seed 1: if(!condition) goto 2; ... operation; goto 1; 2:

Ambos patrones son tan comúnmente utilizados que han sido nombrados y construidos en idiomas.

Si necesita definir un contador para controlar su ciclo, use un ciclo for. Si no, usa un ciclo while.


Una razón es que la condición de un tiempo puede ser una cadena.

Además, si agregamos ''Do'' a la mezcla, podemos usar un ciclo do while cuando queremos que la operación se ejecute al menos una vez, independientemente de su estado actual.


Use for-loop cuando sea apropiado. La solución while tiene inconvenientes sintácticos (es más larga) y debe verificar que incremente i antes de continuar con la llamada dentro del ciclo.


Uso ''while'' cuando no necesito necesariamente un contador, por ejemplo, cuando estás leyendo un archivo y estás esperando alcanzar EOF. En este caso, ''para'' puede no ser la mejor alternativa. Cuando revisa elementos en una matriz, prefiero usar ''para'' porque transmite la intención mejor.


porque este último puede ser un trazador de líneas: mientras (++ i <arr.length) {// do work}