Udostępnij za pośrednictwem


Rozgałęzianie warunkowe

Rozgałęzianie warunkowe jest wyrażane w postaci if wyrażeń. Wyrażenie if składa się z if klauzuli, po której następuje zero lub więcej elif klauzul i opcjonalnie blok else-block. Każda klauzula jest zgodna ze wzorcem

keyword condition {
    <statements>
}

gdzie keyword jest zastępowany if lub elif odpowiednio, condition jest wyrażeniem typu Bool, i <statements> ma zostać zastąpione zero lub więcej instrukcji. Opcjonalny elseblok składa się ze słowa kluczowegoelse, po którym następuje zero lub więcej instrukcji ujętych w nawiasy klamrowe . {}

Pierwszy blok, dla którego condition zostanie uruchomiona true ocena. Jeśli else blok jest obecny, zostanie uruchomiony, jeśli żaden z warunków nie zostanie obliczony na truewartość . Blok jest wykonywany we własnym zakresie, co oznacza, że wszystkie powiązania wykonane w ramach bloku nie są widoczne po zakończeniu bloku.

Załóżmy na przykład, że qubits jest wartością typu Qubit[] i r1 r2 mają typ Result,

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

Można również wyrazić proste rozgałęzianie w postaci wyrażenia warunkowego.

Ograniczenia specyficzne dla elementu docelowego

Ścisła integracja konstrukcji przepływu sterowania i obliczeń kwantowych stanowi wyzwanie dla bieżącego sprzętu kwantowego. Niektóre procesory kwantowe nie obsługują rozgałęziania na podstawie wyników pomiaru. W związku z tym porównanie wartości typu Result zawsze spowoduje błąd Q# kompilacji programów przeznaczonych do uruchamiania na takim sprzęcie.

Inne procesory kwantowe obsługują określone rodzaje rozgałęziania na podstawie wyników pomiaru. Bardziej ogólne if wyrażenia obsługiwane w programie Q# są kompilowane w odpowiednich instrukcjach, które można uruchamiać na takich procesorach. Nałożone ograniczenia to to, że wartości typu Result mogą być porównywane tylko jako część warunku w wyrażeniach if w operacjach. Ponadto bloki uruchamiania warunkowego nie mogą zawierać żadnych return wyrażeń ani aktualizować zmiennych modyfikowalnych, które są deklarowane poza tym blokiem.