Control de flujo: condiciones y bucles
Los dos únicos movimientos que tiene un programa: elegir un camino con álgebra booleana, y repetir un camino hasta que los datos o la condición digan basta.
Un programa que solo guarda valores no hace nada. Se vuelve útil en el momento en que empieza a elegir: si el carrito está vacío, muestra el mensaje de carrito vacío; para cada fila del archivo, suma el precio. Esos son los dos únicos movimientos que tiene un programa. Las condiciones eligen un camino. Los bucles repiten un camino. Todo algoritmo que escribas alguna vez se construye con esos dos movimientos, anidados uno dentro de otro.
En logic:1 escribiste expresiones como not paid, paid and age >= 18, paid or free. Aquello era abstracto. En el código son exactamente las mismas expresiones, y if es la máquina que convierte una de ellas en una acción.
logic:1 code
not paid --> !paid
paid and age >= 18 --> paid && age >= 18
paid or free --> paid || free
if (paid && age >= 18) { ... }El mismo álgebra booleana, dos formas de escribirla. Los nombres de los operadores cambian, las tablas de verdad no.Aquí está la misma decisión en los tres lenguajes: ¿esta persona es adulta?
if age >= 18:
label = "adult"
else:
label = "minor"Python: dos puntos, y sangría en lugar de llaves.let label;
if (age >= 18) {
label = "adult";
} else {
label = "minor";
}JavaScript: llaves alrededor del cuerpo, y punto y coma al final.var label string
if age >= 18 {
label = "adult"
} else {
label = "minor"
}Go: llaves, y la condición va sin paréntesis.Los bucles vienen en dos sabores y elegir el correcto es casi toda la habilidad. Un bucle for se repite una vez por cada elemento de una colección conocida, y algo distinto decide cuándo se detiene. Un bucle while se repite mientras una condición siga siendo true, y tú decides cuándo se detiene cambiando algo dentro del cuerpo.
for item in list: once per item, list decides how many
while needed: while the condition stays true, repeat
for i in range(3): 3 rounds
while retries < 3: up to 3 rounds, or fewer if it succeeds earlyUn bucle for cuenta lo que le dieron. Un bucle while se cuenta a sí mismo, y puede equivocarse.El mismo bucle for en tres lenguajes: sumar una lista de puntuaciones.
total = 0
for score in scores:
total = total + scorePython: for directamente sobre la lista, sin necesidad de índice.let total = 0;
for (const score of scores) {
total = total + score;
}JavaScript: for of recorre los valores, no las posiciones.total := 0
for _, score := range scores {
total = total + score
}Go: range te da la posición y el valor, y Go insiste en que hagas algo con los dos.Ahora el bucle que nunca termina, y por qué ocurre. Un bucle while se repite mientras una condición es true. La condición se comprueba al principio de cada vuelta. Si nada de lo que hay dentro del cuerpo cambia nunca aquello que la condición examina, la condición sigue siendo true para siempre y el bucle se ejecuta para siempre. El programa no está roto. Está haciendo exactamente lo que le dijeron, con toda fidelidad, hasta que cierras la pestaña.
while retries < 3:
print("trying")
trying
trying
trying
... and the tab never comes backLa condición retries < 3 es true en la primera vuelta. Nada dentro cambia nunca retries, así que sigue siendo true en la vuelta un millón.Recuerda el Big-O de logic:1: cuenta los pasos en función de cuántos datos hay, e ignora si la máquina es rápida. Un bucle es donde ese conteo se ve más fácil, porque un bucle sobre n elementos hace su cuerpo n veces.
for x in list: work * n O(n)
for i in range(n):
for j in range(n): work * n * n O(n^2)
n = 1000 O(n) ~1000 steps
O(n^2) ~1000000 stepsUn bucle, n vueltas. Un bucle dentro de un bucle, n por n vueltas.Práctica
Mira el bucle. ¿Cuál es el valor de total cuando termina?
Pistas
- Calcula cada vuelta en papel: cuánto vale total antes de la vuelta y en qué se convierte.
- El bucle no se ejecuta si la condición es false antes de la primera vuelta, así que revisa el valor inicial.
Aquí tienes un bucle while que cuenta atrás desde tres. Ordena las vueltas tal como ocurren, terminando con el momento en que el bucle se detiene.
- 1Volver a comprobar la condición en la siguiente vuelta
- 2Salir del bucle y continuar con la siguiente línea del programa
- 3Ejecutar el cuerpo: imprimir n y restarle uno a n
- 4Comprobar la condición n > 0 y ver que es true
- 5Comprobar la condición y ver que es false, porque n llegó a 0
Pistas
- Nada cambia dentro del cuerpo del bucle: se repiten los mismos pocos pasos, y solo uno de ellos cambia la respuesta.
- Un bucle se detiene porque la condición se vuelve false, y la condición solo puede volverse false si algo dentro del bucle la mueve.
Relaciona cada fragmento de código con cómo crece su coste a medida que crecen los datos. Esta es la idea de Big-O de logic:1, vista desde dentro del bucle.
Pistas
- Compara la forma del crecimiento, no el número exacto de pasos: una fila más puede significar una vuelta más, o n vueltas más.
- Dos bucles anidados sobre la misma lista multiplican; no suman.