演算法中的虛擬碼語法格式

全棧深入發表於2021-06-14

虛擬碼 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,拉你進 『全棧開發架構』群一起學習交流!以下是公眾號"全棧深入"最新文章。

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

相關文章