Uso de bucles para recorrer instrucciones en iteración

Completado

Ha llegado a un punto del programa en el que tiene que llevar a cabo un grupo de instrucciones más de una vez. Es posible que esté trabajando con una estructura de tipo de lista que deba iterar. O bien tendrá que repetir una operación hasta que se cumpla una condición determinada. En estos escenarios, puede usar bucles.

Bucles

Un bucle itera por un rango de valores; por cada valor, el código hace algo, como imprimir resultados en una pantalla o usar el valor en una operación. F# tiene tres tipos de bucles que podemos usar:

  • for...in: en la construcciónfor...in se da por hecho que tenemos una colección enumerable por la que podemos iterar. Este bucle itera por cada valor de una colección.
  • for...to: el bucle for...to empieza y termina donde este bucle itera. Itera hasta que alcanza el valor de una variable de bucle.
  • while...do: el bucle while...do no se centra en una colección enumerable como las dos primeras construcciones. En su lugar,el bucle se repite hasta que se cumpla una condición.

Usar un bucle for...in para cada valor de una colección

La construcción for...in funciona en una colección enumerable. Implementa System.Collections.IEnumerable e incluye listas, secuencias, matrices y otros tipos. Esta es la sintaxis de un bucle for...in:

for <pattern> in <enumerable-expression> do
  <body-expression>

Es importante conocer algunas palabras clave:

  • Patrón: el patrón puede ser el elemento actual o una tupla. Un ejemplo es la iteración por una secuencia. El siguiente código es un ejemplo de cuándo el patrón es el valor i actual. for itera por la lista list y, tras ello, imprime cada valor de la colección:

    let list = [1; 2; 3; 4; 5]
    for i in list do
       printf "%d " i
    
  • Enumerable-expression: la expresión enumerable es la que se recorre en iteración. Puede ser una lista o una secuencia.

  • Expresión corporal: La expresión corporal es donde llevas a cabo la tarea que deseas hacer, como imprimir o realizar un cálculo.

Usar un bucle for...to hasta que se produzca una variable de bucle

La construcción for...to difiere ligeramente de un bucle for...in. La variable de bucle for...to es el límite donde la iteración se detiene. Este es el aspecto de la sintaxis:

for <identifier = start> [ to | downto ] <finish> do
    <body-expression>

Es importante conocer los componentes de la sintaxis:

  • identifier = start: esta sintaxis es una asignación; aquí normalmente se decide de qué variable queremos realizar un seguimiento como parte de la iteración y en qué valor debe comenzar.
  • [to | downto]: podemos elegir entre dos palabras clave diferentes. to significa que el bucle itera hasta ese número. Si usamos downto, el valor del identificador va disminuyendo hasta alcanzar ese número.

Este es un ejemplo que muestra el uso del bucle for...to:

for i = 1 to 10 do
  printfn "%i " i  // prints 1 2 3 4 5 6 7 8 9 10

Este bucle imprime todos los valores entre 1 y 10 (inclusive). Echemos también un vistazo a un ejemplo en el que se usa la construcción for...downto. Esta construcción funciona de forma similar a for...to, pero a la inversa. En el código siguiente se muestra cómo se pueden imprimir los valores de 10 a 1, incluyendo 1:

for i = 10 downto 1 do
  printfn "%i" i  // prints 10 9 8 7 6 5 4 3 2 1

Usar un bucle while...do hasta que una condición se cumpla

La construcción while...do es diferente de las construcciones for...in y for...to. en el sentido de que while...do no itera por una colección, sino que usa un bucle while...do si hay una lógica que requiera la iteración en bucle hasta que una condición se cumpla. Un ejemplo es aceptar argumentos de línea de comandos hasta que un usuario escribe salir.

Este código muestra la sintaxis de una construcción while...do:

while <test-expression> do
  <body-expression>

Un juego de adivinanzas es un ejemplo de uso de una construcción while...do:

open System

let mutable quit = false
let no = 11
while not quit do
   printf "Guess a number: "
   let guess = Console.ReadLine() 
   let guessNo = int guess
   if guessNo = no then
      quit <- true
      printfn "You guessed correctly %i is the secret number" no
   else
      printfn "%i is incorrect" guessNo

El código lleva a cabo un conjunto de instrucciones hasta que la variable quit tenga el valor true. Al establecer el valor de quit en true, cuando un usuario adivina correctamente, el bucle finaliza.