複製鏈接
請複製以下鏈接發送給好友

程序循環

鎖定
程序循環是計算機科學運算領域的用語,也是一種常見的控制流程。循環是一段在程序中只出現一次,但可能會連續運行多次的代碼。循環中的代碼會運行特定的次數,或者是運行到特定條件成立時結束循環,或者是針對某一集合中的所有項目都運行一次。
在一些函數編程語言(例如Haskell和Scheme)中會使用遞歸或不動點組合子來達到循環的效果,其中尾部遞歸是一種特別的遞歸,很容易轉換為迭代。 [1] 
中文名
程序循環 [1] 
定    義
計算機科學運算領域的用語,也是一種常見的控制流程
類    型
經濟術語

程序循環分類

指定運行次數的循環
大部分編程語言都提供循環的指令,可以依指定的次數重複運行一段程序。若指定的次數N小於1,編程語言會忽略整個循環不去運行,若指定的次數N為1,則循環只會運行一次。在循環進行時,循環計數器也會隨着變化,大部分的編程語言可以允許循環計數器上數或是下數,每次的變化量可以是1或是其他不為0的數值。
指定條件的循環
大多數的編程語言都有指令,可以在特定條件成立時繼續循環的進行,或是特定條件不成立時繼續循環的進行,進行到特定條件成立為止。前者一般會標示while,後者一般會標示until。其判斷條件可能在循環一開始就進行,或是在循環最後才進行。前者的循環不一定會運行,而後者1的循環至少會運行一次。
指定集合的循環
許多編程語言支持一種特別的循環,可以針對一個數組中的元素或是一個集合中的所有成員進行循環中的指令,包括Ada、D語言、Smalltalk、PerlJava、C#、Visual BasicRubyPython、JavaScript、Fortran 95等編程語言都有這類的循環結構。
泛用循環結構
有些編程語言有泛用循環結構,可以用來表示指定次數或指定條件的循環,像C語言的for指令或是Common Lisp語言中的do指令都是這類的例子,不過為了程序的可讀性考量,在這些編程語言中還是儘量使用一些含義較明確的指令(如while指令)。
死循環
死循環一般會用在有一段程序需要永遠運行,或是該程序在沒有發生特殊事件(如故障)時需要永遠運行的場合,例如一個事件驅動的程序需要持續運行循環,處理發生的事件,直到用户結束或中斷程序為止。若在指定條件的循環中,其判斷條件用到的變量數值永遠不會改變,這種程序錯誤也會使得此循環變成死循環。
提早結束整個循環
當使用指定次數的循環查表時,會希望在查到需要的數據時就可以直接結束循環的進行,有些編程語言可以用break或exit的指令達到這様的功能,這些指令會結束這個循環,接着會運行循環後面的指令。若此循環在副程序中,也可以用return中斷循環的進行,同時離開副程序。
循環的特殊指令
有時在使用循環的程序中會希望在特定情形下跳過目前循環區塊的指令,回到循環開始運行下一個循環,一般這類的指令會命名為continue、skip或next,其效果是提早結束這次循環的進行,繼續進行下一個循環,若此循環已經是最後一次運行,這類指令會結束循環的進行,繼續進行後續的指令。
像Perl及Ruby等編程語言有redo指令,可以重新運行目前的循環,若在指定次數的循環中,其循環計數器的數值不會變化。Ruby編程語言有retry指令,可以讓循環計數器回到初值,重新運行整個循環。 [1] 

程序循環變式與不變式

循環變式(Loop variant)及循環不變式(Loop invariant)是判斷循環正確性的工具。循環變式是一個初值不為負的整數表示式,在每次運行循環時循環變式的數值需減少,但在正常的循環運行過程中循環變式的數值不會變成負值。循環變式用來確保循環會結束。 循環不變式是一個和循環有關的判斷式,在第一次進入循環之前,循環不變式的值需為真,在後續每一次運行循環時,其值也要為真。當循環正確的結束時,其終止條件和循環不變式都會成立。循環不變式可用來監控在循環進行時,某一指定性質的狀態。
像是Eiffel之類的編程語言本身就有支持循環變式及循環不變式,其他語言可能需要有附加組件才能支持此功能,例如Java就需要配合Java建模語言(Java Modeling Language)規範的loop statements才能支持此機能。 [1] 
參考資料