有没有编程语言有for-while循环?

时间:2017-04-27 04:23:59

标签: loops language-features structured-programming

这就是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>
}

虽然这有效,但感觉非常笨重。在我看来,在无限循环中间进行条件中断违背了结构化编程的精神。

这是一个需要for-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不算数,因为它主要是功能性的,我正在寻找一种主要的命令式编程语言。

1 个答案:

答案 0 :(得分:1)

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

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

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);

注意:三元条件运算符确保仅在<update>为真时才执行<test>部分。