Bucles condicionales

Al igual que la mayoría de los lenguajes de programación clásicos, Q# admite bucles que se interrumpen en función de una condición: bucles cuyo número de iteraciones es desconocido y puede variar de una ejecución a otra. Dado que la secuencia de instrucciones es desconocida en tiempo de compilación, el compilador controla estos bucles condicionales de una manera determinada en un entorno de ejecución cuántico.

Importante

Restricciones de hardware cuántico

Los bucles que se interrumpen en función de una condición son difíciles de procesar en hardware cuántico si la condición depende de los resultados de la medición, ya que la longitud de la secuencia de instrucciones que se va a ejecutar no se conoce con antelación.

A pesar de su presencia habitual en determinadas clases de algoritmos cuánticos, el hardware actual aún no ofrece compatibilidad nativa para este tipo de construcciones de flujo de control. La ejecución de estos tipos de bucles en hardware cuántico puede admitirse potencialmente en el futuro mediante la imposición de un número máximo de iteraciones, o a medida que esté disponible compatibilidad con hardware adicional. Sin embargo, los simuladores cuánticos ejecutarán bucles basados en medidas.

Compilación de bucles

En tanto que la condición no dependa de las medidas cuánticas, los bucles condicionales se procesan con una compilación Just-In-Time antes de enviar la secuencia de instrucciones al procesador cuántico. En particular, el uso de bucles condicionales dentro de funciones no es problemático, ya que el código de las funciones siempre se puede ejecutar en el hardware convencional (no cuántico). Q#, por lo tanto, admite el uso de bucles tradicionales while dentro de las funciones.

Repetir expresión

Al ejecutar programas en simuladores cuánticos, Q# permite expresar el flujo de control que depende de los resultados de las mediciones cuánticas. Esta funcionalidad permite implementaciones probabilísticas que pueden reducir significativamente los costos de cálculo. Un ejemplo habitual son los patrones de repetición hasta el éxito, que repiten un cálculo hasta que se cumple una determinada condición, que suele depender de una medida. Estos bucles repeat se usan ampliamente en clases determinadas de algoritmos cuánticos. Por lo tanto, Q# cuenta con una construcción de lenguaje dedicada para expresarlos, a pesar de que todavía suponen un reto para su ejecución en hardware cuántico.

La repeat expresión tiene la siguiente forma

repeat {
    // ...
}
until condition
fixup {
    // ...
}

O bien, alternativamente:

repeat {
    // ...
}
until condition;

donde condition es una expresión arbitraria de tipo Bool.

El repeat bucle ejecuta un bloque de instrucciones antes de evaluar una condición. Si la condición se evalúa como verdadera, se sale del bucle. Si la condición se evalúa como falsa, se ejecuta un bloque adicional de sentencias definidas como parte de un bloque fixup opcional, si está presente, antes de entrar en la siguiente iteración del bucle.

Bucle while

Un bucle de búsqueda más familiar para cálculos clásicos es el while bucle , que consta de la palabra clave while, una expresión de tipo Booly un bloque de instrucciones. Por ejemplo, si arr es una matriz de enteros positivos,

mutable (item, index) = (-1, 0);
while index < Length(arr) && item < 0 {
    set item = arr[index];
    set index += 1;
}

El bloque de instrucciones se ejecuta mientras la condición se evalúe como true.