2017-04-27 72 views
1

这就是我的意思是通过对-while循环:是否有任何编程语言具有for-while循环?

for (<init>; <update>) <body> while (<test>); 

它大致翻译为:

<init> 
<body> 

while (<test>) { 
    <update> 
    <body> 
} 

这似乎是一个very common programming pattern。然而,我所知道的任何语言都没有这样的控制结构。因此,一个常见的解决方法是实施它如下代替:

<init> 

while (true) { 
    <body> 
    unless (<test>) break; 
    <update> 
} 

虽然这个工程,它感觉非常笨重。我认为,在无限的while循环中进行有条件的中断会违背结构化编程的精神。

下面是需要,而一个激励的例子循环:

function swap(arr, i, j) { 
    var tmp = arr[i]; 
    arr[i] = arr[j]; 
    arr[j] = tmp; 
    return arr; 
} 

function heapify(heap, i) { 
    var len = heap.length; 

    for (var min = i; swap(heap, i, min), i = min) { 
     var left = 2 * i + 1; 
     var right = 2 * (i + 1); 

     if (left < len && heap[left] < heap[min]) min = left; 
     if (right < len && heap[right] < heap[min]) min = right; 
    } while (min !== i); 

    return heap; 
} 

正如你所看到的,控制是很容易跟踪和代码比解决方法清洁了很多:

function swap(arr, i, j) { 
    var tmp = arr[i]; 
    arr[i] = arr[j]; 
    arr[j] = tmp; 
    return arr; 
} 

function heapify(heap, i) { 
    var len = heap.length; 
    var min = i; 

    do (true) { 
     var left = 2 * i + 1; 
     var right = 2 * (i + 1); 

     if (left < len && heap[left] < heap[min]) min = left; 
     if (right < len && heap[right] < heap[min]) min = right; 

     if (min === i) break; 
     swap(heap, i, min); 
     i = min; 
    } 

    return heap; 
} 

无论如何,你知道任何具有这种控制结构的编程语言吗? Lisp不计算因为它主要是功能性的,我正在寻找一个主要是命令式编程语言。

+0

这样的*“非常常见的编程模式”*,我不认为我在我四十年的日志生涯中见过吗?:-) – paxdiablo

+0

@paxdiablo也许你不会写很多需要的程序这个控制结构,这很好。然而,在我十多年的编程经验中,我几次遇到过这种模式。这不是一个很常见的模式。不过,我认为这足以保证新的控制结构。 –

+0

@paxdiablo下面是一个[Python增强建议](https://www.python.org/dev/peps/pep-0315/),其中的控制结构与我所描述的类似。这表明我所描述的编程模式确实并不少见。 –

回答

1

我意识到这不是一个完全令人满意的答案,因为c#没有这样一个内置的控制结构,但我原本预期的语法会更简洁,以至于它几乎就是你所期待的对于。 (事实证明,c#不会将一个隐含的lambda表达式强制转换为布尔函数,因此显式的围绕该表达式的“垃圾”)。

除此之外,以下c#代码演示了我提到的备选关键字选项在评论中:do { <body> } while (<test>; <update>)。这种do-while-update语法与模式流程相比,比您提出的for-while语法更好。除非你关心构造变量的范围,否则任何新的构造都会需要一个特殊的地方(如for循环中),这是个问题,但根据我的经验,任何现有的do-construct都不会提供。

var min = i; //<init> 
do { 
    //<body> 
    var left = 2 * i + 1; 
    var right = 2 * (i + 1); 

    if (left < len && heap[left] < heap[min]) 
     min = left; 
    if (right < len && heap[right] < heap[min]) 
     min = right; 
} while ((min != 1) // <test> 
    ? ((Func<bool>)(() => { 
     swap(heap, i, min); i = min; //<update> 
     return true; }))() : false); 

注:三元条件运算符确保只有当<test>是真实的<update>部分被执行。

相关问题