Поделиться через


Условное ветвление

Условное ветвление выражается в виде выражений if . if Выражение состоит из if предложения, за которым следует нулевое или большее elif число предложений, а также при необходимости другого блока. Каждое предложение следует шаблону:

keyword condition {
    <statements>
}

где keyword заменяется на if или elif соответственно, condition является выражением типа Bool, а <statements> заменяется на ноль или более операторов. Необязательный elseблок состоит из ключевого слова else , за которым следует нулевая или более инструкций, заключенная в фигурные скобки, { }.

Будет выполнен первый блок, для которого condition по результатам вычислений будет равняться true. Блок else (если он имеется) выполняется в том случае, если ни одно из условий не получает значение true. Блок выполняется в собственной области, что означает, что все привязки, сделанные как часть блока, не отображаются после окончания блока.

Например, предположим, что qubits является значением типа Qubit[], а r1 и r2 имеют тип Result,

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

Вы также можете выразить простое ветвление в виде условного выражения.

Ограничения в определенных системах

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

Другие квантовые процессоры поддерживают определенные виды ветвления на основе результатов измерений. Более общие if выражения, поддерживаемые в Q# , компилируются в подходящие инструкции, которые можно запускать на таких процессорах. Введенные ограничения — это то, что значения типа Result могут сравниваться только как часть условия в if выражениях в операциях. Кроме того, блоки условного запуска не могут содержать выражения return или обновлять изменяемые переменные, объявленные за пределами этого блока.