Compartir a través de


Ramificación condicional.

La bifurcación condicional se expresa en forma de if expresiones. Una if expresión consta de una if cláusula, seguida de cero o más elif cláusulas y, opcionalmente, un bloque else. Cada cláusula sigue el patrón

keyword condition {
    <statements>
}

donde keyword se reemplaza por if o elif respectivamente, condition es una expresión de tipo Bool, y <statements> se va a reemplazar por cero o más instrucciones. El bloque opcional elseconsta de la palabra clave else seguida de cero o más instrucciones entre llaves, { }.

Se ejecutará el primer bloque para el cual condition se evalúe como true. El bloque else, si está presente, se ejecuta si ninguna de las condiciones se evalúa como true. El bloque se ejecuta en su propio ámbito, lo que significa que los enlaces realizados como parte del bloque no son visibles después de que finalice el bloque.

Por ejemplo, supongamos que qubits es un valor del tipo Qubit[], y r1 y r2 son del tipo Result,

if r1 == One {
    let q = qubits[0];
    H(q);
} 
elif r2 == One {
    let q = qubits[1];
    H(q);
} 
else {
    H(qubits[2]);
}

También puede expresar bifurcaciones simples en forma de una expresión condicional.

Restricciones específicas del destino

La estrecha integración entre las construcciones de flujo de control y los cálculos cuánticos supone un desafío para el hardware cuántico actual. Ciertos procesadores cuánticos no admiten la creación de ramas basada en los resultados de la medición. Por lo tanto, la comparación de valores de tipo Result siempre producirá un error de compilación para los programas de Q# destinados a ejecutarse en dicho hardware.

Otros procesadores cuánticos admiten tipos específicos de creación de ramas en función de los resultados de la medición. Las expresiones más generales if admitidas en Q# se compilan en instrucciones adecuadas que se pueden ejecutar en dichos procesadores. Las restricciones impuestas son que los valores de tipo Result solo se pueden comparar como parte de la condición dentro if de las expresiones en las operaciones. Además, los bloques de ejecución condicional no pueden contener expresiones return ni actualizar variables mutables declaradas fuera de ese bloque.