是否有任何编程语言具有do-until循环?
示例:
do
{
<statements>
}
until (<condition>);
基本上相当于:
do
{
<statements>
}
while (<negated condition>);
注意:我正在寻找测试后循环。
答案 0 :(得分:1)
Ruby直到。
i=0
begin
puts i
i += 1
end until i==5
答案 1 :(得分:1)
答案 2 :(得分:0)
在VB中我们可以找到类似的东西:
Reponse = InputBox("Please Enter Pwd")
Do Until Reponse = "Bob-pwr148" ...
答案 3 :(得分:0)
Eiffel为您提供了一个直到循环。
from
x := 1
until
x > 100
loop
...
end
也有一个“跨”循环。两者都非常强大且富有表现力。
此循环的设计还有更多提供。它的语法还有另外两个部分,可以帮助我们解决两个重要的“正确性”问题。
无穷循环保护
让我们通过添加 loop变体来稍微修改我们的循环代码。
from
x := 1
v := 1_000
until
x > 100
variant
v
loop
...
v := v - 1
end
循环变量(本质上)是一个递减计数变量,而不仅仅是任何旧变量。通过使用 variant 关键字,我们告诉编译器要注意 v 。具体来说,编译器将生成在两种情况下监视 v 变量的代码:
v 是否随着循环的每次迭代而减少(我们在递减计数)。如果实际上不是不倒数,尝试使用倒数变量是没有好处的,对吧?如果循环变量没有递减(减少任何数量),则抛出异常。
v 是否曾经达到小于零的条件?如果是这样,那么我们将引发异常。
这两种方法都通过编译器和variant变量一起工作,以检测我们的迭代循环何时以及是否无法迭代或迭代太多次。
在上面的示例中,我们的代码正在向我们传达一个故事,该故事期望将迭代0到1_000次,但不会更多。如果更多,那么我们将停止循环,这使我们想知道:我们是否真的有案例,如果我们迭代超过1_000次,或者是否存在某种错误,表明我们的条件未能变为 True ?
循环不变
现在我们知道什么是循环变量,我们需要了解什么是循环不变变量。
不变式是一组一个或多个布尔条件,在每次通过循环进行迭代之后,这些条件必须包含 True 。我们为什么要这些?
想象一下您有1_000_000次迭代,其中之一失败了。您没有时间遍历每个迭代,对其进行检查以查看是否可以。因此,您将创建一组一个或多个条件,这些条件将在每次迭代完成后进行测试。如果一个或所有条件都失败了,那么您可以准确地知道是哪个迭代(及其确定性状态)引起了问题!
循环不变式可能类似于:
from
x := 1
y := 0
v := 1_000
invariant
y = x - 1
until
x > 100
variant
v
loop
...
x := x + 1
y := y + 1
v := v - 1
end
在上面的示例中,y落后x x1。我们希望在每次迭代之后,y始终为x-1。因此,我们使用不变式创建循环不变式 关键字,用于声明我们的布尔断言。如果y不能为x-1,则循环将立即引发异常,并让我们确切地知道哪个迭代未能保持断言 True 。
结论
我们的循环现在非常紧密和安全-可以防止失败(错误,错误)。