Pętle warunkowe

Podobnie jak w przypadku większości klasycznych języków programowania, Q# obsługuje pętle, które przerywają się na podstawie warunku: pętle, dla których liczba iteracji jest nieznana i może się różnić od uruchomienia do uruchomienia. Ponieważ sekwencja instrukcji jest nieznana w czasie kompilacji, kompilator obsługuje te pętle warunkowe w określony sposób w środowisku uruchomieniowym kwantowym.

Ważne

Ograniczenia sprzętu kwantowego

Pętle, które przerywają się na podstawie warunku, są trudne do przetworzenia na sprzęcie kwantowym, jeśli warunek zależy od wyników pomiaru, ponieważ długość sekwencji instrukcji do uruchomienia nie jest znana z wyprzedzeniem.

Pomimo ich wspólnej obecności w konkretnych klasach algorytmów kwantowych bieżący sprzęt nie zapewnia jeszcze natywnej obsługi tego rodzaju konstrukcji przepływu sterowania. Uruchamianie tego rodzaju pętli na sprzęcie kwantowym może być potencjalnie obsługiwane w przyszłości przez nałożenie maksymalnej liczby iteracji lub udostępnienie dodatkowej obsługi sprzętu. Symulatory kwantowe będą jednak uruchamiać wszystkie pętle na podstawie pomiarów.

Kompilowanie pętli

Tak długo, jak warunek nie zależy od pomiarów kwantowych, pętle warunkowe są przetwarzane przy użyciu kompilacji just in time przed wysłaniem sekwencji instrukcji do procesora kwantowego. W szczególności używanie pętli warunkowych w ramach funkcji jest nieproblematyczne, ponieważ kod w ramach funkcji może zawsze działać na konwencjonalnym (nie kwantowym) sprzęcie. Q#w związku z tym obsługuje stosowanie tradycyjnych while pętli w funkcjach.

Powtórz wyrażenie

Podczas uruchamiania programów w symulatorach Q# kwantowych można wyrazić przepływ sterowania, który zależy od wyników pomiarów kwantowych. Ta funkcja umożliwia probabilistyczne implementacje, które mogą znacznie zmniejszyć koszty obliczeniowe. Typowym przykładem jest wzorzec powtarzania do powodzenia , który powtarza obliczenia do momentu spełnienia określonego warunku , który zwykle zależy od miary. Takie repeat pętle są powszechnie używane w określonych klasach algorytmów kwantowych. Q# dlatego ma dedykowaną konstrukcję języka do wyrażania ich, mimo że nadal stanowią one wyzwanie do wykonania na sprzęcie kwantowym.

Wyrażenie repeat ma następującą formę

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

lub alternatywnie

repeat {
    // ...
}
until condition;

gdzie condition jest dowolne wyrażenie typu Bool.

Pętla repeat uruchamia blok instrukcji przed oceną warunku. Jeśli warunek ma wartość true, pętla kończy działanie. Jeśli warunek ma wartość false, zostanie uruchomiony dodatkowy blok instrukcji zdefiniowany jako część opcjonalnego fixup bloku, jeśli istnieje, przed wprowadzeniem iteracji następnej pętli.

Pętla while

Bardziej znaną pętlą do obliczeń klasycznych jest while pętla, która składa się ze słowa kluczowego while, wyrażenia typu Booli bloku instrukcji. Na przykład, jeśli arr jest tablicą dodatnich liczb całkowitych,

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

Blok instrukcji jest uruchamiany tak długo, jak warunek daje wartość true.