Partilhar via


Ciclos condicionais

Tal como a maioria das linguagens de programação clássicas, Q# suporta ciclos que quebram com base numa condição: ciclos para os quais o número de iterações é desconhecido e pode variar de execução para execução. Uma vez que a sequência de instruções é desconhecida no tempo de compilação, o compilador processa estes ciclos condicionais de uma forma específica num runtime quântico.

Importante

Restrições de hardware quântico

Os ciclos que quebram com base numa condição são difíceis de processar no hardware quântico se a condição depender dos resultados da medição, uma vez que a duração da sequência de instruções a executar não é conhecida antecipadamente.

Apesar da sua presença comum em classes específicas de algoritmos quânticos, o hardware atual ainda não fornece suporte nativo para estes tipos de construções de fluxo de controlo. Executar estes tipos de ciclos no hardware quântico pode potencialmente ser suportado no futuro ao impor um número máximo de iterações ou à medida que o suporte de hardware adicional fica disponível. No entanto, os simuladores quânticos executarão todos os ciclos com base nas medições.

Compilar ciclos

Desde que a condição não dependa das medições quânticas, os ciclos condicionais são processados com uma compilação just-in-time antes de enviar a sequência de instruções para o processador quântico. Em particular, a utilização de ciclos condicionais nas funções não é proproblemática, uma vez que o código dentro das funções pode sempre ser executado em hardware convencional (não quântico). Q#, portanto, suporta a utilização de ciclos tradicionais while nas funções.

Repetir expressão

Ao executar programas em simuladores quânticos, Q# permite-lhe expressar o fluxo de controlo que depende dos resultados das medições quânticas. Esta capacidade permite implementações probabilísticas que podem reduzir significativamente os custos computacionais. Um exemplo comum é o padrão de repetição até ao sucesso , que repete uma computação até que uma determinada condição - que normalmente depende de uma medição - seja satisfeita. Estes repeat ciclos são amplamente utilizados em classes específicas de algoritmos quânticos. Q# assim, tem uma construção de linguagem dedicada para expressá-los, apesar de ainda representarem um desafio para a execução no hardware quântico.

A repeat expressão assume o seguinte formulário

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

ou, em alternativa,

repeat {
    // ...
}
until condition;

em que condition é uma expressão arbitrária do tipo Bool.

O repeat ciclo executa um bloco de instruções antes de avaliar uma condição. Se a condição for avaliada como verdadeira, o ciclo é fechado. Se a condição for avaliada como falsa, será executado um bloco adicional de instruções definido como parte de um bloco opcional fixup , se estiver presente, antes de introduzir a iteração do ciclo seguinte.

Ciclo While

Um ciclo mais familiar para cálculos clássicos é o while ciclo, que consiste na palavra-chave while, numa expressão do tipo Boole num bloco de instrução. Por exemplo, se arr for uma matriz de números inteiros positivos,

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

O bloco de instrução é executado desde que a condição seja avaliada como true.