是否有任何语言具有do-until循环?

时间:2011-07-07 23:33:31

标签: loops language-features do-loops

是否有任何编程语言具有do-until循环?

示例:

do
{
    <statements>
}
until (<condition>);

基本上相当于:

do
{
    <statements>
}
while (<negated condition>);

注意:我正在寻找测试后循环。

4 个答案:

答案 0 :(得分:1)

Ruby直到。

i=0
begin
  puts i
  i += 1
end until i==5

答案 1 :(得分:1)

VBA!

Do-Until-Loop

Do-Loop-Until

虽然我认为这里的很多人都会怀疑它是否真的是一种真正的语言,但是,BASIC就是微软的起点(对我们来说,很多人都非常认真)......

答案 2 :(得分:0)

在VB中我们可以找到类似的东西:

 Reponse = InputBox("Please Enter Pwd")
  Do Until Reponse = "Bob-pwr148" ...

答案 3 :(得分:0)

Eiffel为您提供了一个直到循环。

from 
  x := 1 
until 
  x > 100 
loop 
  ... 
end

也有一个“跨”循环。两者都非常强大且富有表现力。

此循环的设计还有更多提供。它的语法还有另外两个部分,可以帮助我们解决两个重要的“正确性”问题。

  1. 无限循环保护。
  2. 迭代失败检测。

无穷循环保护

让我们通过添加 loop变体来稍微修改我们的循环代码。

from 
  x := 1
  v := 1_000
until 
  x > 100 
variant
  v
loop 
  ...
  v := v - 1 
end

循环变量(本质上)是一个递减计数变量,而不仅仅是任何旧变量。通过使用 variant 关键字,我们告诉编译器要注意 v 。具体来说,编译器将生成在两种情况下监视 v 变量的代码:

  1. v 是否随着循环的每次迭代而减少(我们在递减计数)。如果实际上不是倒数,尝试使用倒数变量是没有好处的,对吧?如果循环变量没有递减(减少任何数量),则抛出异常。

  2. 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

结论

我们的循环现在非常紧密和安全-可以防止失败(错误,错误)。