­

算法中的偽代碼語法格式 – 算法實現表達利器

偽代碼 pseudo-code,是一種非正式的,類似自然語言,用於描述模塊結構圖的語言。對於熟練不同編程語言的程序員要理解其他編程語言編寫的功能時很困難,而偽代碼清晰、簡單、可讀性好,可將整個算法運行過程的結構用接近自然語言的形式描述出來。偽代碼不關心軟件工程的問題,常忽略數據抽象、模塊性、錯誤處理的問題。

1、操作類型

操作類型 符號 示例
分配 ← 或 := c ← 2πr, c:= 2πr
比較 =, ≠, <, >, ≤, ≥
算術 +, −, ×, /, mod
上界/下界 ⌊, ⌋, ⌈, ⌉ a ← ⌊b⌋ + ⌈c⌉
邏輯 and, or
總和、乘積 ∑ ∏ $$h ← ∑_{a∈A}1/a $$

x and y,當x成立時才會對y求值,否則x將短路,不再對y求值
x or y,當x成立時才會y求值,否則x將短路,不再對y求值

2、語法規則

1、每一條指令佔一行(else if除外)
2、指令後不跟任何符號
3、用縮進表示塊結構、分支結構,代替begin..end、if-then-else語句

3、組成部分

3.1 算法名稱

過程:Procedure,執行一系列操作,不需返回結果,無返回數據
函數:Function,執行一系列操作,需返回結果,有返回數據

Procedure <算法名>([<參數列表>])
Function <算法名>([<參數列表>])

3.2 指令序列

用Begin或”{“作為開始,用End或”}”作為結束。

Begin
    指令序列;
End


{
    指令序列;
}

3.3 輸入/輸出

輸入:input,參數作值或對象的指針被傳遞
輸出:output 或 return,return語句返回多個會上並回到過程的調用點。
錯誤:error,調用出現異常,調用過程負責處理該錯誤,當前程序不用說明如何處理

3.4 分支選擇

//第一種
If<條件> Then
{
    指令序列;
}

//第二種
If<條件> Then
{
    指令序列1;
}
Else
{
    指令序列2;
}

3.5 賦值

x:=x+1;
x<-x+1;

3.6 循環

  • 計數式循環
    迭代增加循環計數器時,用to
    迭代減少循環計數器時,用downto
    步進用by
For 變量:=初值 To 終值
{
    指令序列;
}

循環次數:終值-初值+1

  • 條件式循環
While (條件) do
{
    指令序列;
}

3.7 數組

A[j]指示數組A的第j個元素。符號「 …」用來指示數組中值的範圍。
例如:
A[1…j]表示含元素A[1], A[2], … , A[j]的子數組;
還有個寫法是A[0:n]表示數組下標從0開始一直到n
二維數組也是:A[0:m,0:n]

3.8 算法結束

關鍵字End的後面加上算法名稱,表示算法結束,是算法的最後一句。

End DFS

3.9 注釋

//表示行注釋

3.10 對象

複合數據通常被組織成對象,由屬性組成,用對象.屬性對象.對象.屬性表示,如A.b.c。數組或對象的變量常看做一個數組或對象的指針。當指針不指向任何對象時為NIL

4、偽代碼示例

 // 冒泡排序
 procedure Bubble(n:integer);
   var temp,i,j:integer;
   change:boolean;
   begin
      for i:=1 to n-1 do
      begin
        change:=false;
        for j:=n-1 downto i do
          if a[j]>a[j+1] then
          begin
            change:=true;
            temp:=a[j]; a[j]:=a[j+1]; a[j+1]:=temp;
          end;
          if not(change) then exit;
      end;
   end;

// 插入排序
procedure insertsort(n:integer);
  var i,j:integer;
  begin
    for i:=2 to n do
    begin
      a[0]:=a[i];
      j:=i-1;
      while a[j]>a[0] do
      begin
        a[j+1]:=a[j];
        j:=j-1;
      end;
      a[j+1]:=a[0];
    end;
  end;

/* this is a pseudocode sample */

a := 1
b ← a + 2
c :=[100]

if a ≥ 2 then
    goto Label_Print
else
    for i := 0 to 100
        a := a + i

    do j := (a+b*i)/100
        c[j] = a+b*i
    until j>100

    return

Label_Print:
    while b ≠ 3 and a = 4 do
        call log(b,a)
    end

exit

作者簡介:常遇,現阿里巴巴高級技術專家。關注「全棧深入」微信公眾號並回復 「全棧圖譜」 下載高清全棧知識圖譜壓縮包。全棧深入提供全棧知識分享,包含不限於前端開發、後台開發、機器學習、雲計算等。如需轉載本文請註明作者:常遇 及 來源:「全棧深入」微信公眾號。

如需轉載本文請註明作者:常遇 及 來源:「全棧深入」微信公眾號。 加我微信 stacker1024,拉你進 『全棧開發架構』群一起學習交流!以下是公眾號”全棧深入”最新文章。

[推薦] 史上最全全棧技術知識導圖 [可下載]
[推薦] 硬核瀏覽器原理
[推薦] 面試騰訊、阿里、頭條,數據結構和算法就靠他了