2017-04-27 75 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>部分被執行。

相關問題