Bedingte Schleifen

Q# unterstützt ähnlich wie die meisten klassischen Programmiersprachen Schleifen, die basierend auf einer Bedingung unterbrochen werden – also Schleifen mit einer unbekannten Anzahl von Iterationen, die von Ausführung zu Ausführung variieren kann. Da die Anweisungssequenz zur Kompilierzeit unbekannt ist, werden diese bedingten Schleifen in einer Quantenruntime auf eine bestimmte Weise behandelt.

Wichtig

Quantenhardwareeinschränkungen

Schleifen, die basierend auf einer Bedingung unterbrochen werden, sind schwierig bei der Verarbeitung auf Quantenhardware , wenn die Bedingung von Messergebnissen abhängt, da die Länge der auszuführenden Anweisungssequenz nicht im Voraus bekannt ist.

Trotz ihrer allgemeinen Präsenz in bestimmten Klassen von Quantenalgorithmen bietet die aktuelle Hardware noch keine native Unterstützung für derartige Ablaufsteuerungskonstrukte. Das Ausführen dieser Art von Schleifen auf Quantenhardware kann möglicherweise in Zukunft unterstützt werden, indem eine maximale Anzahl von Iterationen festgelegt wird oder wenn zusätzliche Hardwareunterstützung verfügbar wird. Quantensimulatoren führen jedoch alle Schleifen basierend auf Messungen aus.

Kompilieren von Schleifen

Sofern die Bedingung nicht von Quantenmessungen abhängt, werden bedingte Schleifen mit einer Just-In-Time-Kompilierung verarbeitet, bevor die Anweisungssequenz an den Quantenprozessor gesendet wird. Die Verwendung bedingter Schleifen ist insbesondere innerhalb von Funktionen unproblematisch, da Code innerhalb von Funktionen immer auf herkömmlicher Hardware (nicht quantenbasierter Hardware) ausgeführt werden kann. Q#unterstützt daher die Verwendung herkömmlicher while Schleifen innerhalb von Funktionen.

Ausdruck wiederholen

Wenn Sie Programme in Quantensimulatoren ausführen, Q# können Sie den Steuerfluss ausdrücken, der von den Ergebnissen der Quantenmessungen abhängt. Diese Funktion ermöglicht probabilistische Implementierungen, die die Berechnungskosten erheblich reduzieren können. Ein gängiges Beispiel ist das Muster Wiederholung bis Erfolg, bei dem eine Berechnung wiederholt wird, bis eine bestimmte (in der Regel von einer Messung abhängige) Bedingung erfüllt ist. Solche repeat-Schleifen werden häufig in bestimmten Klassen von Quantenalgorithmen verwendet. Q# verfügt daher über ein dediziertes Sprachkonstrukt, um sie auszudrücken. Sie stellen allerdings immer noch eine Herausforderung für die Ausführung auf Quantenhardware dar.

Der repeat Ausdruck hat die folgende Form:

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

oder alternativ

repeat {
    // ...
}
until condition;

wobei condition ein beliebiger Ausdruck vom Typ Bool ist.

Die repeat Schleife führt einen Block von Anweisungen aus, bevor eine Bedingung ausgewertet wird. Die Schleife wird beendet, wenn die Bedingung als „true“ ausgewertet wird. Wenn die Bedingung als „false“ ausgewertet wird, wird ein zusätzlicher Anweisungsblock, der als Teil eines optionalen fixup-Blocks definiert ist, ausgeführt, bevor die nächste Schleifeniteration beginnt.

while-Schleifen

Eine vertrautere Schleife für klassische Berechnungen ist die Schleife, die while aus dem Schlüsselwort (keyword) while, einem Ausdruck vom Typ Boolund einem Anweisungsblock besteht. Wenn z.B. arr ein Array von positiven ganzen Zahlen ist,

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

Der Anweisungsblock wird ausgeführt, solange die Auswertung der Bedingung true ergibt.