算法中的伪代码语法格式 - 算法实现表达利器

伪代码 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,拉你进 『全栈开发架构』群一起学习交流!以下是公众号"全栈深入"最新文章。

[推荐] 史上最全全栈技术知识导图 [可下载]
[推荐] 硬核浏览器原理
[推荐] 面试腾讯、阿里、头条,数据结构和算法就靠他了

专注于机器学习、前端相关邻域。关注 全栈深入 公众号查看更多硬核文章。
posted @ 2021-06-14 20:30  全栈深入  阅读(250)  评论(0编辑  收藏  举报