《趣题学算法》—第0章0.3节算法的伪代码描述
本節書摘來自異步社區《趣題學算法》一書中的第0章0.3節算法的偽代碼描述,作者徐子珊,更多章節內容可以訪問云棲社區“異步社區”公眾號查看。
0.3 算法的偽代碼描述
上一節最后一段使用自然語言(漢語)描述了解決“計算逆序數”問題的算法。即如何將輸入數據轉換為輸出數據的過程。在需要解決的問題很簡單的情況下(例如“計算逆序數”問題),用自然語言描述解決這個問題的算法是不錯的選擇。但是,自然語言有一個重要特色——語義二岐性。語義二岐性在文學藝術方面有著非凡的作用:正話反說、雙關語……。由此引起的誤會、感情沖突……帶給我們多少故事、小說、戲劇……。但是,在算法描述方面,語義二岐性卻是我們必須避免的。因為,如果對數據的某一處理操作的表述上有二岐性,會使不同的讀者做出不同的操作。對同一輸入,兩個貌似相同的算法的運行,將可能得出不同的結果。這樣的情況對問題的解決可能是災難性的。所以,自然語言不是最好的描述算法的工具。
在計算機上,算法過程是由一系列有序的基本操作描述的。不同的計算機系統,同樣的操作,指令的表達形式不必相同。本書并不針對特殊的計算機平臺描述解決計算問題的算法,我們需要一個通用的、簡潔的形式描述算法,并且能方便地轉換成各種計算機系統上特殊表達形式(計算機程序設計語言)所描述的程序。描述算法的通用工具之一叫偽代碼。例如,解決上述問題數據輸入/輸出的偽代碼過程可描述如下。
1 打開輸入文件inputdata 2 創建輸出文件outputdata 3 從inputdata中讀取案例數據N 4 while N>0 5 do 創建數組A[1..N] 6 for i←1 to N 7 do 從inputdata中讀取A[i] 8 result←GET-THE-INVERSION(A) 9 將result作為一行寫入outputdata 10 從inputdata中讀取案例數據N 11 關閉inputdata 12 關閉outputdata其中,第8行調用計算序列A[1..N]的逆序數過程GET-THE-INVERSION(A)是解決一個案例的關鍵,其偽代碼過程如下。
GET-THE-INVERSION(A) ?A[1..N]表示一個序列 1 N←length[A] 2 count←0 3 for j←N downto 2 4 do for i←1 to j-1 5 do if A[i]>A[j] ?檢測到一個逆序 6 then count←count+1 ?累加到計數器 7 return count算法0-1 解決“計算逆序數”問題的一個案例的算法偽代碼過程
偽代碼是一種有著類似于程序設計語言的嚴格外部語法(用if-then-else表示分支結構,用for-do、while-do或repeat-until表示循環結構),且有著內部寬松的數學語言表述方式的代碼表示方法。它既沒有二歧性的缺陷(嚴格的外部語法),又能用高度抽象的數學語言簡練地描述操作細節。
本書所使用的偽代碼書寫規則如下。
① 用分層縮進來指示塊結構。例如,從第3行開始的for循環的循環體由第4~6行的3行組成,分層縮進風格也應用于if-then-else語句,如第5~6行的if-then語句。
② 對for循環,循環計數器在退出循環后仍然保留。因此,一個for循環剛結束時,循環計數器的值首次超過for循環上界。例如在算法0-1中,當第3~6行的for循環結束時,j = N+1;而第4~6行的for循環結束時,i=1?1=0。
③ 符號“ ?”表示本行的注釋部分。例如,算法0-1的開頭對參數A的意義進行了解釋,第5行說明檢測到一個逆序(iA[j]),而第6行說明將此逆序累加到逆序數count(count自增1)。
④ 多重賦值形式i ← j← e對變量i和j同賦予表達式e的值;它應當被理解為在賦值操作j ← e之后緊接著賦值操作i ← j。
⑤ 變量(如i,j,及count)都局部于給定的過程。除非特別需求,我們將避免使用全局變量。
⑥ 數組元素是通過數組名后跟括在方括號內的下標來訪問。例如,A[i]表示數組A的第i個元素。記號“…”用來表示數組中取值的范圍。因此,A[1…i]表示數組A的取值由A[1]到A[i],i個元素構成的子序列。
⑦ 組合數據通常組織在對象中,其中組合了若干個屬性。用域名[對象名]的形式來訪問一個具體的域。例如,我們把一個數組A當成一個對象,它具有說明其所包含的元素個數的屬性length。為訪問數組A的元素個數,我們寫length[A]。
表示數組或對象的變量被當成一個指向表示數組或對象的指針。對一個對象x的所有域f,設y ← x將導致f[y] = f[x]。此外,若設f[x]← 3,則不僅有f[x] = 3,且有f[y] = 3。換句話說,賦值y ← x后,x和y指向同一個對象。
有時,一個指針不指向任何對象,此時,我們給它一個特殊的值NIL。
⑧ 過程的參數是按值傳遞的:被調用的過程以復制的方式接收參數,若對參數賦值,則主調過程不能看到這一變化。
⑨ 布爾運算符“and”和“or”都是短回路的。也就是說,當我們計算表達式“x and y”時,先計算x。若x為FALSE,則整個表達式不可能為TRUE,所以我們不再計算y。另一方面,若x為TRUE,我們必須計算y以確定整個表達式的值。相仿地,在表達式“x or y”中,我們計算表達式y當且僅當x為FALSE。短回路操作符使得我們能夠寫出諸如“x ≠ NIL and f [x] = y”這樣的布爾表達式而不必擔心當x為NIL時去計算f [x]。
總結
以上是生活随笔為你收集整理的《趣题学算法》—第0章0.3节算法的伪代码描述的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《AR与VR开发实战》——2.7 3D物
- 下一篇: 《社会智能与综合集成系统》第1章1.节参