本節書摘來自華章計算機《算法基礎》一書中的第1章,第1.3節,作者:(美)羅德·斯蒂芬斯(rod stephens)著,更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視
為了使本書中描述的算法盡可能有用,首先我們用直覺的術語來描述它們。有了這個高層次的解釋,可以能夠用大多數的程式設計語言來實作這些算法。
然而,一個算法的實作經常包含很多難以實作的瑣碎細節。為了使這些細節易于處理,算法也用僞代碼來描述。僞代碼是很像程式設計語言但又不是真正的程式設計語言的一種文本。僞代碼提供了代碼實作算法過程中會用到的結構和細節,同時又不與某種特定的程式設計語言聯系在一起。希望你能把這些僞代碼翻譯成真正的代碼,然後在你的計算機上執行。
下面的代碼片段展示了計算兩個整數的最大公約數(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。)
僞代碼應該是很直覺并易于了解的,但是如果你發現一些無法了解的東西,請在這本書的讨論論壇上發帖提出問題或者發送郵件到[email protected],我會給你指出正确的方向。
僞代碼存在一個問題:沒有任何編譯器來檢測錯誤。作為對基礎算法的檢測,本書同時給你一些實際的代碼作為參考,c#實作的算法和許多練習可以在本書的網站上下載下傳。