Articles

Programación esencial | Estructuras de control

Bucles

Las «sentencias de bucle» no son más que la automatización de procesos de varios pasos mediante la organización de secuencias de acciones, y la agrupación de las partes que deben repetirse. También una parte central de la programación, la iteración (o Looping) da a los ordenadores gran parte de su poder. Pueden repetir una secuencia de pasos tantas veces como sea necesario, y las repeticiones adecuadas de pasos sencillos pueden resolver problemas complejos.

En términos generales, hay dos tipos de «Técnicas de bucle»:

  1. «Bucles For»: son los que se ejecutan durante un número prescrito de veces, según lo controlado por un contador o un índice.
  2. «Bucles While» y «Bucles de repetición»: se basan en el inicio y verificación de una condición lógica. La condición se comprueba al inicio o al final de la construcción del bucle.

Vamos a verlos:

1) Bucles For

En esta Estructura de Control, las sentencias se ejecutan una tras otra en un orden consecutivo sobre una secuencia de valores que se evalúa sólo cuando se inicia el «Bucle For» (nunca se reevalúa). En este caso, el número de iteraciones es fijo y conocido de antemano.

Bucle For

Si la evaluación de la condición sobre una variable (que puede asumir valores dentro de una secuencia especificada) da como resultado TRUE, se ejecutarán secuencialmente una o más sentencias sobre esa cadena de valores. Una vez que la primera prueba de la condición se hace (y resulta TRUE), la sentencia se ejecuta y la condición se evalúa de nuevo, pasando por un proceso iterativo. La sección «variable en secuencia» realiza esta prueba sobre cada valor de la secuencia hasta cubrir el último elemento.

Si la condición no se cumple y el resultado es FALSO (por ejemplo, la parte «variable en secuencia» ha terminado de recorrer todos los elementos de la secuencia), el bucle termina. Si la prueba de la condición resulta FALSE en la primera iteración, el «Bucle For» nunca se ejecuta.

La sintaxis de los «Bucles For» es:

Ejemplo 1

Para mostrar cómo funcionan los «Bucles For», primero crearemos una secuencia concatenando diferentes nombres de frutas para crear una lista (llamada «lista_frutas»):

Utilizaremos esta lista de frutas como «secuencia» en un «Bucle For», y haremos que el «Bucle For» ejecute una sentencia una vez (imprimiendo el nombre de cada valor) por cada valor proporcionado en la secuencia (las diferentes frutas de la lista de frutas):

De esta forma, el resultado del «Bucle For» es el siguiente:

## "Apple"
## "Kiwi"
## "Orange"
## "Banana"

Así que imprimimos el nombre de cada valor de la lista. No es gran cosa, ¿verdad? Lo bueno es que los «Bucles For» pueden ser utilizados para producir resultados más interesantes. Mira el siguiente ejemplo.

Ejemplo 2

¿Qué pasa si queremos modificar valores, o realizar cálculos secuencialmente? Puedes utilizar «Bucles For» para realizar operaciones matemáticas de forma secuencial sobre cada valor de un vector (elementos del mismo tipo, que en este caso será numérico).

En este ejemplo, crearemos una secuencia de números (del 1 al 10), y pondremos un «Bucle For» para calcular e imprimir la raíz cuadrada de cada valor de esa secuencia:

En este caso, el resultado del «Bucle For» es:

 1
1.414214
1.732051
2
2.236068
2.449490
2.645751
2.828427
3
3.162278

Se puede utilizar cualquier tipo de operador matemático sobre una secuencia numérica, y como veremos más adelante en este artículo, hacer todo tipo de combinaciones entre diferentes Estructuras de Control para llegar a resultados más complejos.

2) Bucles While

En los «Bucles While» se evalúa primero una condición, y si el resultado de probar esa condición es TRUE, se ejecutan repetidamente una o varias sentencias hasta que esa condición se convierta en FALSE.

Bucle While

A diferencia de las «Sentencias If», en las que una condición probada como TRUE ejecuta una expresión sólo una vez y termina, los «Bucles While» son sentencias iterativas que ejecutan alguna expresión una y otra vez hasta que la condición se convierte en FALSE. Si la condición nunca resulta ser FALSE, el «Bucle While» continuará para siempre y el programa se bloqueará. Al revés, si la prueba de la condición resulta FALSE al principio del bucle, la expresión nunca se ejecutará.

La sintaxis de los «Bucles While» es:

Ejemplo 1

Veamos un ejemplo. Primero crearemos una variable (x) y le asignaremos el valor de 1. A continuación, establecemos un «Bucle While» para probar iterativamente una condición sobre esa variable hasta que el test de la condición resulte FALSE:

Así es como funciona: el valor inicial de la variable (x) es 1, por lo que cuando probamos la condición «¿es la variable (x) menor que 10?», el resultado evalúa a TRUE y se ejecuta la expresión, imprimiendo el resultado de la variable (x), que en el primer caso es 1. Pero luego ocurre algo: la variable (x) se incrementa en 1 antes de que la función termine, y en la siguiente iteración el valor de x será 2.

Esta reasignación de la variable es importante porque finalmente se llegará a la condición FALSE y a la salida del bucle (valor de x = 10). Si no se cambian las condiciones iniciales en un «While Loop» se producirá un bucle infinito y una caída del programa.

Salida

 1
2
3
4
5
6
7
8
9

Ejemplo 2

¿Has oído hablar de la secuencia de Fibonacci? Se trata de una serie de números con la característica de que el siguiente número de la secuencia se encuentra sumando los dos números que le preceden: 0, 1, 1, 2, 3, 5, 8, 13, 21,… Esta secuencia se puede encontrar en varios fenómenos de la naturaleza, y tiene diferentes aplicaciones en finanzas, música, arquitectura y otras disciplinas.

Calculemosla utilizando un «Bucle While».

En este caso establecemos un valor máximo en la serie como condición de parada, de forma que el bucle imprime la serie de Fibonacci sólo para los números inferiores a 100. Cuando un elemento de la serie (el que sea) sea mayor que 100, el ciclo del bucle termina.

 0
1
1
2
3
5
8
13
21
34
55
89

Ejemplo 3

Otra forma de generar la serie de Fibonacci con un «While Loop» es, en lugar de establecer el valor máximo de la serie como condición de parada, establecer el número de elementos de la serie que se quiere generar.

Este «Bucle While» añade el siguiente elemento de la serie al final del elemento anterior, hasta alcanzar una condición de parada. En este caso, cuando la serie llega a 10 elementos (sin importar los valores), el bucle termina.

Salida

 0 1 1 2 3 5 8 13 21 34

3) Bucles de repetición

Emparentados con los «Bucles While», los «Bucles de repetición» ejecutan sentencias de forma iterativa, pero hasta que se cumpla una condición de parada. De esta manera, las sentencias se ejecutan al menos una vez, sin importar el resultado de la condición, y el bucle se sale sólo cuando cierta condición se convierte en TRUE:

Repetir bucle

La sintaxis de los «bucles de repetición» es:

Los «Bucles de repetición» utilizan «sentencias Break» como condición de parada. «Las sentencias de ruptura» se combinan con la prueba de una condición para interrumpir los ciclos dentro de los bucles, ya que cuando el programa llega a una ruptura, pasará el control a la instrucción inmediatamente posterior al final del bucle (si lo hay).

«Bucles de repetición» se ejecutarán para siempre si no se cumple la condición de ruptura. Vea estos 2 ejemplos

Ejemplo 1

Primero creamos una variable (x) y le asignamos el valor de 5. Luego ponemos un «Bucle de repetición» para imprimir iterativamente el valor de la variable, modificar el valor de la variable (aumentarlo en 1), y probar una condición sobre esa variable (si es igual a 10) hasta que la prueba de la condición resulte TRUE.

La «condición de ruptura» se dispara cuando la variable (x) llega a 10, y el bucle termina.

Salida

 5
6
7
8
9

Ejemplo 2

Supongamos ahora que producimos una lista de números aleatorios, de los que desconocemos el orden o la secuencia de generación.

En este ejemplo utilizaremos un «Bucle de repetición» para generar una secuencia de números aleatorios distribuidos normalmente (se puede generar aleatoriamente con cualquier otra distribución, sólo elegimos ésta), y romperemos la secuencia una vez que uno de esos números sea mayor que 1. Como no sabemos qué números vendrán primero, no sabemos qué longitud tendrá la secuencia: sólo conocemos la condición de ruptura.

Primero, usamos la instrucción «set.seed» para fijar los números aleatorios (generar siempre los mismos números aleatorios), y hacer este ejemplo reproducible.

Luego iniciamos el «Bucle de repetición» generando un número aleatorio normalmente distribuido, imprimiéndolo, y comprobando si ese número es mayor que 1. Sólo cuando esta condición se convierta en TRUE (puede ser con el primer número generado, o no), el ciclo del bucle pasará a la sentencia de ruptura y terminará.

Salida

 -0.9619334
-0.2925257
0.2587882
-1.152132
0.1957828
0.03012394
0.08541773
1.11661

Esto muestra una vez más la importancia de establecer una condición de ruptura adecuada. No hacerlo resultará en un bucle infinito.

Pensamientos finales

Hemos visto y explicado conceptos de forma aislada, pero las «Estructuras de Control» se pueden combinar de cualquier forma: Los bucles pueden contener varios bucles internos; los condicionales pueden contener bucles y condicionales, las opciones son infinitas. (de hecho, al revisar «Bucles de repetición» encontramos que los ejemplos contenían «Sentencias If» anidadas).

Se pueden desarrollar soluciones avanzadas simplemente combinando las «Estructuras de Control» que explicamos en este artículo. Como dijo Minsky, podemos llegar a resultados complejos como consecuencia de la interacción de componentes más simples. Las Estructuras de Control constituyen los bloques básicos para los procesos de toma de decisiones en la informática. Cambian el flujo de los programas y nos permiten construir conjuntos complejos de instrucciones a partir de bloques de construcción más simples.

Mi consejo es: aprende sobre ellas.

Te facilitará el camino hacia la codificación y la comprensión de los programas, y te ayudará a encontrar nuevas formas de resolver problemas.