条件付きループ
ほとんどの従来のプログラミング言語と同じように、Q# では、条件に基づいて中断されるループがサポートされます。つまり、反復回数が不明で、実行ごとに異なる可能性があるループです。 命令シーケンスはコンパイル時には不明であるため、量子ランタイムでは、コンパイラが特別な方法でこれらの条件付きループを処理します。
重要
量子ハードウェアの制限
条件に基づいて中断するループは、実行する命令シーケンスの長さが事前にわかっていないため、 条件が計測結果に依存する場合、量子ハードウェアで処理するのが困難です。
量子アルゴリズムの特定のクラスで一般的に存在するにもかかわらず、現在のハードウェアでは、これらの種類の制御フロー コンストラクトに対するネイティブ サポートはまだ提供されていません。 量子ハードウェアでこれらの種類のループを実行する場合は、今後、イテレーションの最大数を設定するか、追加のハードウェア サポートが利用可能になったときにサポートされる可能性があります。 ただし、量子シミュレーターでは、測定値に基づいてループが実行されます。
ループのコンパイル
条件が量子測定に依存していない限り、条件付きループは、Just-In-Time コンパイルで処理された後、命令シーケンスが量子プロセッサに送信されます。 特に、関数内でのコードは常に従来の (非量子) ハードウェアで実行できるため、関数内で条件付きループを使用しても問題ありません。
Q#そのため、 は関数内での従来 while
のループの使用をサポートしています。
繰り返し式
量子シミュレーターでプログラムを実行する場合、 Q# 量子測定値の結果に依存する制御フローを表現できます。
この機能により、計算コストを大幅に削減できる確率的な実装が可能になります。
一般的な例としては、repeat-until-success パターンがあります。このパターンでは、通常、測定に依存する特定の条件が満たされるまで計算が繰り返されます。 このような repeat
ループは、量子アルゴリズムの特定のクラスで広く使用されています。 そのため Q# には、量子ハードウェアでの実行に関する課題をもたらすにもかかわらず、それらを表現するための専用の言語構成要素があります。
式は repeat
次の形式になります。
repeat {
// ...
}
until condition
fixup {
// ...
}
または、次のようになります。
repeat {
// ...
}
until condition;
ここで、condition
は Bool
型の任意の式です。
ループは repeat
、条件を評価する前にステートメントのブロックを実行します。 条件の評価結果が true である場合、ループが存在します。 条件の評価結果が false である場合、省略可能な fixup
ブロックの一部として定義されたステートメントの追加ブロック (存在する場合) が実行されてから、次のループ反復が開始されます。
while ループ
従来の計算のより使い慣れたループはwhile
、キーワード (keyword)while
、型Bool
の式、およびステートメント ブロックで構成される ループです。
たとえば、arr
が正の整数の配列である場合は次のようになります。
mutable (item, index) = (-1, 0);
while index < Length(arr) && item < 0 {
set item = arr[index];
set index += 1;
}
条件が true
に評価される限り、ステートメント ブロックが実行されます。