你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

条件循环

与大多数经典编程语言相似,Q# 支持基于条件中断的循环:迭代次数未知且可能因运行而异的循环。 由于指令序列在编译时未知,因此编译器在量子运行时中按特定方式处理这些条件循环。

重要

量子硬件限制

如果条件取决于度量结果,则基于条件中断的循环很难在量子硬件上处理,因为要运行的指令序列的长度事先未知。

尽管它们普遍存在于特定类别的量子算法中,但当前的硬件尚未为此类控制流构造提供本机支持。 将来可能通过施加最大迭代次数或在提供其他硬件支持时,支持在量子硬件上运行这些类型的循环。 但是,量子模拟器将基于度量运行任何循环。

编译循环

只要条件不依赖于量子度量,就可通过在将指令序列发送到量子处理器之前进行即时编译来处理条件循环。 特别是,在函数中的使用条件循环不成问题,因为函数中的代码总是可以在传统(非量子)硬件上执行。 Q#因此, 支持在函数中使用传统 while 循环。

重复表达式

在量子模拟器上运行程序时, Q# 允许表达取决于量子度量结果的控制流。 这种能力可以有概率实现显著降低计算成本。 一个常见示例是“重复直到成功”模式,它重复计算直到满足特定条件(通常取决于度量值)。 此类 repeat 循环广泛用于特定类别的量子算法。 因此,Q# 具有专用的语言结构来进行表达,尽管这种循环仍然对量子硬件上的执行构成挑战。

表达式 repeat 采用以下形式

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

或者

repeat {
    // ...
}
until condition;

其中 conditionBool 类型的任意表达式。

循环在 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,就会运行语句块。