偽·從零開始學演算法-1.4 結構化編程與邏輯結構
這一節前面還算簡單,到後面超級難。
還望大家能夠理解,如果有什麼不會的也可以問我,我也會盡量解答。
結構化編程簡述
結構化編程來源於20世紀60年代的軟體危機。那時,goto(無條件轉移)語句的濫用導致了軟體代碼難以維護,進而讓軟體開發變得異常困難。有一個最有名的例子就是IBM為其大型機IBM System/360編寫的系統IBM OS/360,動用1000多名程序員,其開發經歷了十年。
科拉多·伯姆(Corrado B?hm)及朱塞佩·賈可皮尼(Giuseppe Jacopini)於1966年5月在《Communications of the ACM》期刊發表論文,說明任何一個有goto指令的程序,可以改為完全不使用goto指令的程序。後來艾茲赫爾·戴克斯特拉(Edsger Wybe Dijkstra)在1968年也提出著名的論文《GOTO陳述有害論》(Go To Statement Considered Harmful),因此結構化編程開始盛行。
結構化編程是一種編程典範。它採用子程序、代碼區塊、for循環以及while循環等結構,來取代傳統的 goto。希望藉此來改善計算機程序的明晰性、質量以及開發時間,並且避免寫出麵條式代碼。它的提出使程序設計可遵循著一定的結構形式和方法,因而提高了程序設計的效率和質量,為調試和維護程序提供了方便,以便於軟體的擴充、改進、組織和管理,因此大大地降低了軟體的成本。
結構化程序的特點
結構化編程的三種基本邏輯結構
對邏輯結構進行規範,有助於演算法和程序的分塊、理解和編製。
以下結構中,某一塊可以以除終端框外的任意塊或者結構代替。結構可嵌套。
順序結構
顧名思義,就是各個塊之間按順序執行。如圖:先執行A,再執行B,再執行後續操作。
順序結構
條件結構
條件結構是首先對變數等某一信息進行判斷,根據判斷的結果執行後續的流程。一般來說有兩種情況:
(1)如圖:如果A條件為真,執行B,再進行後續操作;否則直接進行後續操作。
條件結構(1)
絕大多數編程語言都採用上面的做法,而非將「是」和「否」置換過來的做法。如果需要「如果A條件為真,直接進行後續操作;否則,執行B,再進行後續操作」,最常用的做法是改變A條件為非A(?A)。這種情況也適用於後面的情形。
(2)如圖:如果A條件為真,執行B,再進行後續操作;否則,執行C,再進行後續操作。
條件結構(2)
循環結構
循環結構是進行循環操作的語句。一般來說有兩種情況:
(1)直到型:先執行後判斷。如圖:執行A,判斷B條件是否成立。如果成立,執行A;否則,進行後續操作。
循環結構-直到型
(2)當型:先判斷後執行。如圖:判斷A條件是否成立。如果成立,執行B,再判斷A條件是否成立;否則,進行後續操作。
循環結構-當型
特殊的邏輯結構
上面的邏輯結構已經能夠解決幾乎所有的演算法問題。不過,有一些特殊的形式,由於編程語言的支持,需要注意。
有條件跳轉
之前說過,結構化編程是為了避免goto的濫用導致的一系列問題。雖然goto語句目前仍然可以在許多編程語言中使用,但是如果不是萬不得已,絕對不要用。不過,事實上存在goto的替代品,只能作用於一個結構內。它們是break和continue語句。
break語句會中止循環,直接進行後續操作,如圖:如果B後接break語句(橙色箭頭),則會在執行B之後直接進行後續操作。
break語句
continue語句會結束本輪循環,提前開始下一步循環,如圖:如果B後接continue語句(綠色箭頭),則會在執行B之後,跳轉至循環判斷語句。
continue語句
它們常常與條件結構共用。
switch結構
上面的條件結構只支持是/否的二分支情況。在表達多分支的條件結構時,我們使用switch結構。
switch結構的流程圖如下:先判斷A的值,當A=a時,執行B1,再執行B2,執行到C,然後進行後續操作;當A=b時,執行B2,執行到C,然後進行後續操作;……若無對應值,執行C,然後進行後續操作。
switch結構
這樣的結構當然不能符合要求。在實際應用中,我們通常使用break語句來讓分支執行完畢後直接進行後續操作。下圖是當所有分支都使用break語句之後的流程圖:先判斷A的值,當A=a時,執行B1;當A=b時,執行B2;……若無對應值,執行C。再執行後續操作。
常見的switch結構
for循環
for循環是一種特殊的當型循環結構。它是先初始化某個循環變數,然後判斷循環變數是否符合某條件。如果符合,執行A,再改變循環變數的值,再判斷循環變數是否符合某條件。否則,執行後續操作。
for循環
在20世紀80年代的江蘇科學技術出版社出版的《廣播電視中專教材 計算機應用基礎》中,for循環在流程圖中有一種簡寫符號,這種簡寫符號適用於上圖中執行A之後對循環變數進行加操作的情況。但是現在應該是很少用了:
for循環簡寫
遞歸
遞歸是子程序中調用本身的情況。這種情況難以使用流程圖描述。它常常與條件結構共用。以下的圖是一個求階乘的遞歸演算法。
求階乘的遞歸演算法
在這裡,遞歸的複雜程度取決於輸入的x。當輸入x=3時,遞歸過程如下:
遞歸過程(1)
遞歸過程(2)
遞歸過程(3)
遞歸過程(4)
參考資料
最近因為有旅遊,所以可能會斷更幾天,請見諒。


※《熊出沒》中的悲涼與無奈
※唐人街探案2:直男抖機靈討喜指南
TAG:全球大搜羅 |