Условные циклы

Подобно большинству классических языков программирования, Q# поддерживает циклы, выполнение которых прерывается по условию, т. е. циклы, число итераций которых заранее неизвестно и может каждый раз меняться. Так как последовательность инструкций неизвестна во время компиляции, компилятор обрабатывает эти условные циклы в квантовой среде выполнения определенным образом.

Важно!

Ограничения квантового оборудования

Циклы, которые прерываются на основе условия, сложно обработать на квантовом оборудовании, если условие зависит от результатов измерения, так как длина выполняемой последовательности инструкций не известна заранее.

Несмотря на их широкое применение в определенных классах квантовых алгоритмов, подобные конструкции потока управления пока не поддерживаются текущим оборудованием. Запуск таких циклов на квантовом оборудовании потенциально может поддерживаться в будущем путем введения максимального количества итераций или по мере того, как станет доступна дополнительная поддержка оборудования. Квантовые симуляторы, однако, будут выполнять любые циклы на основе измерений.

Циклы компиляции

Если условие не зависит от квантовых измерений, условные циклы обрабатываются путем JIT-компиляции перед отправкой последовательности инструкций квантовому процессору. В частности, их использование в функциях не представляет сложности, так как код в функциях всегда может выполняться на обычном (не квантовом) оборудовании. Q#поэтому поддерживает использование традиционных while циклов в функциях.

Выражение repeat

При запуске программ в квантовых симуляторах позволяет выразить поток управления, Q# зависящий от результатов квантовых измерений. Эта возможность обеспечивает вероятностные реализации, которые могут значительно снизить затраты на вычисления. Распространенный пример — шаблоны repeat-until-success, повторяющие вычисления до тех пор, пока не будет выполнено определенное условие, которое обычно зависит от результата измерения. Такие циклы repeat широко используются в квантовых алгоритмах определенных классов. Поэтому в Q# есть специальная языковая конструкция для их выражения, хотя их выполнение на квантовом оборудовании по-прежнему представляет сложность.

Выражение repeat принимает следующую форму:

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

Либо так:

repeat {
    // ...
}
until condition;

Здесь condition — это произвольное выражение типа Bool.

Цикл repeat выполняет блок инструкций перед оценкой условия. Если условие принимает значение true, происходит выход из цикла. Если условие принимает значение false, перед следующей итерацией цикла выполняются операторы, определенные в необязательном блоке fixup (если он имеется).

Цикл While

Более привычным циклом для классических вычислений является while цикл, состоящий из ключевое словоwhile, выражения типа Boolи блока инструкций. Например, если arr — это массив положительных целых чисел:

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

Блок операторов выполняется, пока условие имеет значение true.