Lección 3
Condiciones y bucles
if como expresión, las tres formas de repetir, ranges, loop labels, break con valor y continue.
Tres formas de repetir, y un nombre para cada bucle
En «Variables, funciones y control de flujo» ya usaste if y for de forma
informal, sin nombrar por qué if produce un valor ni que existen otras dos
formas de repetir. Aquí completamos el vocabulario: loop, while y for
cubren casos distintos, y los rangos, las etiquetas y break/continue te
dan control fino sobre cuándo parar.
Este vocabulario reaparece en el resto del curso: iteradores, match, y más
adelante el operador ? construyen sobre las mismas ideas de expresión y
control de flujo que ves aquí.
Verás cuatro estaciones: if como expresión, las tres formas de repetir,
rangos y etiquetas, y las dos salidas de un bucle.
Ejercicio 01 · Conjetura de Collatz
Cuenta cuántos pasos tarda una secuencia de Collatz en llegar a 1.
El starter ya declara la firma. Completa el cuerpo con un bucle `while` que aplique la regla par/impar en cada vuelta hasta llegar a 1.
Objetivo
Completa collatz_steps para que cuente los pasos: si n es par, divide entre 2; si es impar, calcula 3 * n + 1. Repite hasta que n valga 1 y devuelve el número de pasos dados.
Implementa
Sustituye `todo!` por un bucle `while n != 1` con un `if`/`else` para par/impar.
Función 01
Contar los pasos de Collatz
Repite la regla par/impar hasta llegar a 1, sumando una vuelta por cada paso aplicado.
/// Counts the steps the Collatz sequence takes to reach 1 from `start`.
pub fn collatz_steps(start: u64) -> u32 {
todo!("loop while n != 1: even -> n / 2, odd -> 3 * n + 1, count each step")
}Comprueba
Ejecuta los casos visibles y usa el diagnóstico para corregir el código.
Pruebas visibles
Modifica el código antes de ejecutar las pruebas.
Ayuda
Consulta pistas progresivas o compara con la solución.
/// Counts the steps the Collatz sequence takes to reach 1 from `start`.
#[must_use]
pub fn collatz_steps(start: u64) -> u32 {
let mut n = start;
let mut steps = 0;
while n != 1 {
if n % 2 == 0 {
n /= 2;
} else {
n = 3 * n + 1;
}
steps += 1;
}
steps
}
// Playground entry point for this example.
fn main() {
println!("{}", collatz_steps(6));
}Resumen
ifes una expresión: produce un valor, y sus dos ramas deben tener el mismo tipo.looprepite hasta unbreakexplícito;whilecomprueba su condición antes de cada vuelta;forrecorre un rango o iterador.- Los rangos
../..=excluyen o incluyen el final; una etiqueta ('outer) identifica qué bucle debe romperse cuando hay varios anidados. break 'etiquetasale del bucle exterior directamente, sin banderas auxiliares.continuesalta a la siguiente vuelta sin ejecutar el resto del cuerpo.break valortermina unloopy ese valor se convierte en el resultado del bucle.