Uso de bucles para recorrer instrucciones en iteración
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...inse 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 buclefor...toempieza y termina donde este bucle itera. Itera hasta que alcanza el valor de una variable de bucle. -
while...do: el buclewhile...dono 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
iactual.foritera por la listalisty, tras ello, imprime cada valor de la colección:let list = [1; 2; 3; 4; 5] for i in list do printf "%d " iEnumerable-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.tosignifica que el bucle itera hasta ese número. Si usamosdownto, 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.