¿Qué tipo de bucle utilizar?

HelThunk

Buenas,
Posiblemente para la mayoría de vosotros esto sea algo obvio, pero para mi es algo confuso, ¿cuando utilizar un bucle u otro?.
Me explico, imaginémonos que queremos analizar cada carácter en un String. Tenemos varias formas:

*Código en VB.NET, pero se puede trasladar a cualquier lenguaje...

i=0
While i <> nuestrostring.Lengh
-funciónes blabla-
i = i + 1
End while
i=0
Do Until i = nuestrostring.Lenght
-funciónes blabla-
i = i + 1
Loop
For i  to nuestrostring.Lenght
-funciónes blabla-
Next

*Para saber por que carácter vamos dentro del String utilizaríamos i como indice.
Estos tres bucles cumplen lo deseado, mi pregunta es... ¿cuando hay que usar cual?
*Yo normalmente utilizo While, no tengo razón alguna, por eso me gustaría saber cual es lo óptimo, suponiendo que si hay +3 formas de hacer un bucle, es por el hecho de que cada uno es mejor en x circunstancia.
Gracias de antemano.

Martita-

Yo utilizo el ultimo, siempre me ha gustado mas, no se porque.

Fyn4r

Lo que me enseñaron en su día así en resumen:

  • El do-while cuando quieres 1 iteración si o si
  • For cuando sabes exactamente el número de iteraciones
  • While cuando no sabes cuantas iteraciones serán necesarias / cualquier otro caso.

Luego descubres el for-each y ya nunca usas otro pero bueno xD

6 3 respuestas
B

For y Foreach.

Loa do while no deberían ni existir.
Los while para casos puntuales y en zonas miy concretas

drakkenspain

Yo sigo lo que dice #3. Para el caso que has puesto yo usaría el for sin duda.

s4suk3

yo si no necesito contadores uso foreach, si necesito saber indices o cosas así el for normal
como dice #3, el while nunca se ve

1 respuesta
JackSparow

Olvídate del Do while.

For si haces recorridos (como este caso).
While cuando haces una cerca (tiene una condición que te puede forzar a salir del bucle antes de recorrer todos los elemtos).

En tu caso es un for claramente.

1
Merkury

#6 sabes que for each en la gran mayoria de lenguajes al iterar sobre arrays puedes establecer el conteo por medio de la posicion del elemento en el array y la key.

Y si ya es un array clasico, sinplemente la key te lo da.

1 respuesta
m4andg4

Lo de #3. Con for y while cubres todas las necesidades, yo por ejemplo el do-while no lo uso nunca.
FOR: para recorrer un objeto un numero de iteraciones concreto
WHILE: Para cuando quiero añadir una condición de salida del bucle, ya que break está muy mal visto por los entornos universitarios.

Ejemplo:
Si quiero hacer la suma de los valores de todos los caracteres del string: uso FOR porque se que voy a recorrer el String entero
Si quiero recorrer un string hasta que me encuentre con una "E" y salirme del bucle uso el while.

4 respuestas
HelThunk

#9 Cuando dices:

Si quiero recorrer un string hasta que me encuentre con una "E" y salirme del bucle uso el while.

después de la E supongo que no utilizas un break, pero al no utilizar un break, el while se tiene que completar hasta que vuelva a analizar la condición de entrada, no?

1 respuesta
eXtreM3

#8 bendito result as key -> value

Merkury

#9 Nada ni nadie te obliga a usar el for psra recorrer el array entero. For es para realizar un numero definido de iteraciones, el que tu dices es for each.

1 respuesta
HelThunk

*Aclaro #9; comentas que utilizas While cuando sabes que posiblemente tengas que salir del bucle, sin embargo, yo tenía pensado que se utilizaba de la siguiente forma:

i= 0
e = False
While i <> nuestrostring.Lengh and e = False
-funciónes blabla-
i = i + 1
End while

En este ejemplo, se ejecuta el while entero, si dentro del while el valor de 'e' cambia a 'True', la siguiente vez que se analiza la sentencia (While i <> nuestrostring.Lengh and e = False) no se ejecutara el código porque la sentencia será falsa.

Sin embargo, tu comentas que en cualquier momento puedes salirte sin utilizar break:

Si quiero recorrer un string hasta que me encuentre con una "E" y salirme del bucle uso el while.

Esto es lo que me gustaría que me aclarases. ¿Cómo paras un while para salirte de la sentencia sin utilizar break?. Un saludo.

1 4 respuestas
eXtreM3

#13

while (aux != 'e') {
   //stuff
   ...
   aux = e; //aquí rompe y adiós bucle
}
2 respuestas
Soulscx

#13 si haces lo que dicen luego no te olvides de preguntar después del while por cual de las condiciones saliste si por fin de cadena si por encontrar la letra o si ni entró ....
además algunos lenguajes te dejan usar el for como while añadiendole más condiciones, asi que elige el q mas te guste

HelThunk

#14 Pero el bucle se va en la siguiente iteración , la actual no se para. Para explicarme mejor:

while (aux != 'e') {
   //stuff
   ...
   aux = e; //aquí rompe y adiós bucle en la siguiente iteración 
   pepito = 1 + 1; //Esto se ejecuta, ya que el bucle sigue hasta que termine esta iteración y vuelva a analizar la sentencia while (aux != 'e')
}
1 respuesta
Troyer

#14 En este caso sería mejor usar do while ya que al menos se hará una iteración.

1 respuesta
Soulscx

#17 la cadena puede llegar vacía y entrar en un bucle infinito
#16 quieren q pongas todo el código encima, que en ese caso daría lo mismo

JackSparow

#13

i= 0
encontrado = false
While ( i <nuestrostring.Lenght and !encontrado )
       if(nuestrostring[i] == 'a') then encontrado=true endif
       i = i + 1
End while
m4andg4

#12 Correcto, se me ha ido la pinza, edito

#10 la e la comprueba en en while algo tipo:

while(i < len(string) && string[i] != 'e'){
    //tratamiento que le quieras dar
    i++;
}

Que leyendo tu respuesta de #13 es basicamente lo que tu habias pensado. el i++ o i= i+1 cuenta como recorrer, cuando el while comprueba y ve que hemos dado con una 'e' directamente no entra al bucle, que es lo que queríamos.

Ya estás parando el bucle, porque imagina que el string tiene 10 caracteres y nos encontramos con la 'e' en el tercer ciclo. Pues se sale y no lo sigue recorriendo hasta leer la cadena entera.

La opción con break sería:

while(i < len(string)){
    //tratamiento que le quieras dar
    i++;
    if(string[i] == 'e')
        break;
}

que equivale a:

for( int i = 0; i< len(stirng); i++){
    //tratamiento
    if(string[i] == 'e')
        break;
}

Y estos dos ultimos casos son los que tienes que evitar.

#13 vamos a masticarlo un poco más:

str : String = "mete"  //longitud 4
i : int = 0;
while(i < len(string) && str[i] != 'e'){
    //tratamiento que le quieras dar
    i++;
}

1ª iteracion ----> i=0; str[i] = 'm'; while(true) ---> entra al bucle y tratamiento + aumenta i;
2ª iteración ----> i=1; str[i] = 'e'; while(false); ----> no entra al bucle;
1 1 respuesta
HelThunk

#20 Perfecto, es como había pensado que era, me había confundido el comentario de #9. Gracias.

Usuarios habituales

  • HelThunk
  • m4andg4
  • JackSparow
  • Soulscx
  • eXtreM3
  • Merkury
  • Martita-