偽代碼是很像編程語言但又不是真正的編程語言的一種文本。偽代碼提供了代碼實現算法過程中會用到的結構和細節,同時又不與某種特定的編程語言聯系在一起。希望你能把這些偽代碼翻譯成真正的代碼,然后在你的計算機上執行。
下面的代碼片段展示了計算兩個整數的最大公約數(GCD)算法的偽代碼示例:
取模操作
取模操作,在偽代碼中寫作Mod。它意味着整除之后的余數。比如說,13 Mod 4=1。因為13被4除,商是3,余數是1。
偽代碼以一個注釋開頭。注釋以字符“//”開始然后延伸到這一行的結束。
代碼實際的第一行是算法的聲明。這個算法叫做Gcd(最大公約數),它返回了一個整數結果。它有兩個名為a和b的整數參數。
注 執行一個任務或者有選擇地返回一個結果的一塊代碼稱為例程、子例程、方法、過程、子過程或者函數。
聲明之后的代碼縮進以顯示它是方法的一部分。方法主體的第一行以一個While循環開始。
只要While語句的條件保持為真,While下縮進的代碼就會被執行。
While循環在End While語句處結束。End While語句並不是嚴格需要的,因為縮進顯示了循環結束的地方,但是它(End While)提醒了什么樣的語句塊將要結束。
這個方法在Return語句處退出。這個算法返回了一個數值,所以這個Return語句表明了該算法應該返回哪個值。如果這個算法沒有返回任何數值,例如,如果其目的是排列數值或者建立一個數據結構,那么Return語句執行后就沒有任何返回值。
這個例子中的偽代碼非常接近於實際的編程代碼。其他的例子可能包含自然語言描述的指令和數值,這種情況下,指令用尖括號(< >)括起來,以表示需要把這些自然語言形式的指令翻譯成程序代碼。
通常,當聲明一個參數或變量時(在Gcd算法中, 這包括參數a和b以及變量remainder),會在它前面給出數據類型,數據類型后面跟着一個冒號,如Integer: reminder。對於簡單的整形循環變量,數據類型可能會被省略,如For i = 1 To 10。
偽代碼不同於某些編程語言的另一個特點是它的For循環可能包含一個Step語句,用以表明循環變量每個循環后改變的數值。For循環以Next i語句結尾(i是循環變量),用來提醒你哪一個循環結束了。
例如,請思考下列的偽代碼:
本書中用的偽代碼使用If-Then-Else語句、Case語句和其他需要的語句。從對於真正編程語言的了解來看,讀者應該很熟悉這些語句。偽代碼需要的別的東西都用英語闡明。
鏈表(List)是一個對你來說可能不熟悉的基礎數據結構。鏈表類似於一個自我擴展的數組。它提供了一個Add方法讓用戶向鏈表的末尾添加元素。下面的偽代碼建立了一個包含數字1到10的整數鏈表:
在鏈表被初始化之后,偽代碼可以像普通數組一樣使用它並從鏈表的任意位置獲取元素。與數組不同的是,鏈表也允許你在任何位置添加或刪除元素。
本書中的許多算法被寫成返回一個結果的方法或函數。方法聲明的開頭是結果的數據類型。如果一個方法執行了一些任務而沒有返回一個結果,那么它就沒有數據類型。
下列的偽代碼包含了兩個方法:
DoubleIt方法接受一個整數作為參數然后返回了一個整數值,這段代碼加倍了輸入值並返回了結果。
DoSomething方法接受一個叫做value的整數數組作為參數,它執行了一個任務但是沒有返回結果。例如,它可能會隨機化或排列數組中的元素。(注:本書假定數組從下標0開始。例如,一個有三個元素的數組有下標0、1、2。)
偽代碼應該是很直觀並易於理解的,但是偽代碼存在一個問題:沒有任何編譯器來檢測錯誤。作為對基礎算法的檢測,本書同時給你一些實際的代碼作為參考,C#實現的算法和許多練習可以在本書的網站上下載。