-
2021-03-10 09:07:08
伪代码是自然语言和类编程语言组成的混合结构。它比自然语言更精确,描述算法很简洁;同时也可以很容易转换成计算机程序。下面就为大家介绍一下伪代码描述算法的介绍。
伪代码描述算法
一、算法描述是指对设计出的算法,用一种方式进行详细的描述,以便与人交流。描述可以使用自然语言、伪代码,也可使用程序流程图,但描述的结果必须满足算法的五个特征;
二、使用自然语言描述算法显然很有吸引力,但是自然语言固有的不严密性使得要简单清晰的描述算法变得很困难。因此,使用伪代码来描述算法是一个很好的选择;
1、输入:一个算法必须有零个或以上输入量;输出:一个算法应有一个或以上输出量,输出量是算法计算的结果;
2、明确性:算法的描述必须无歧义,以保证算法的实际执行结果是精确地符合要求或期望,通常要求实际运行结果是确定的;
3、有限性:依据图灵的定义,一个算法是能够被任何图灵完备系统模拟的一串运算,而图灵机器只有有限个状态、有限个输入符号和有限个转移函数(指令)。而一些定义更规定算法必须在有限个步骤内完成任务;
4、有效性:又称可行性。能够实现,算法中描述的操作都是可以通过已经实现的基本运算执行有限次来实现;
三、伪代码(Pseudocode)是一种算法描述语言。使用伪代码的目的是为了使被描述的算法可以容易地以任何一种编程语言(Pascal,C,Java,etc)实现。因此,伪代码必须结构清晰、代码简单、可读性好,并且类似自然语言。 介于自然语言与编程语言之间;
四、它以编程语言的书写形式指明算法的职能。相比于程序语言(例如Java, C++,C, Dephi 等等)它更类似自然语言。它是半角式化、不标准的语言。我们可以将整个算法运行过程的结构用接近自然语言的形式(这里,你可以使用任何一种你熟悉的文字,中文,英文 等等,关键是你把你程序的意思表达出来)描述出来,使用伪代码,可以帮助我们更好的表述算法,不用拘泥于具体的实现;
五、当考虑算法功能(而不是其语言实现)时,伪代码常常得到应用。计算机科学在教学中通常使用虚拟码,以使得所有的程序员都能理解;综上,简单的说,让人便于理解的代码。不依赖于语言的,用来表示程序执行过程,而不一定能编译运行的代码。在数据结构讲算法的时候用的很多;
以上就是伪代码描述算法的具体介绍了,希望可以帮助到你哦。
更多相关内容 -
用伪代码描述算法教学提纲.ppt
2020-11-18 09:13:06用伪代码描述算法;4.算法的发现;5-算法的特征 (书P6) 例计算1+2+3++100= 分析计算这道题目的算法有限制范围可以在有限时间内完成这是算法的第一个特征有穷性计算时可以用纸笔算盘运算器和计算机来完成且计算过程是... -
用伪代码描述算法.pptx
2020-06-01 06:39:37;一算法是灵魂;4.算法的发现;5-算法的特征 (书P6) 例计算1+2+3++100= 分析计算这道题目的算法有限制范围可以在有限时间内完成这是算法的第一个特征有穷性计算时可以用纸笔算盘运算器和计算机来完成且计算过程是多样... -
算法描述---伪代码
2021-03-10 09:07:51描述可以使用自然语言、伪代码,也可使用程序流程图,但描述的结果必须满足算法的五个特征。使用自然语言描述算法显然很有吸引力,但是自然语言固有的不严密性使得要简单清晰的描述算法变得很困难。因此,使用伪代码...算法描述
算法描述是指对设计出的算法,用一种方式进行详细的描述,以便与人交流。描述可以使用自然语言、伪代码,也可使用程序流程图,但描述的结果必须满足算法的五个特征。
使用自然语言描述算法显然很有吸引力,但是自然语言固有的不严密性使得要简单清晰的描述算法变得很困难。因此,使用伪代码来描述算法是一个很好的选择。
算法的特征
输入:一个算法必须有零个或以上输入量。
输出:一个算法应有一个或以上输出量,输出量是算法计算的结果。
明确性:算法的描述必须无歧义,以保证算法的实际执行结果是精确地符合要求或期望,通常要求实际运行结果是确定的。
有限性:依据图灵的定义,一个算法是能够被任何图灵完备系统模拟的一串运算,而图灵机器只有有限个状态、有限个输入符号和有限个转移函数(指令)。而一些定义更规定算法必须在有限个步骤内完成任务。
有效性:又称可行性。能够实现,算法中描述的操作都是可以通过已经实现的基本运算执行有限次来实现。
伪代码
伪代码是自然语言和类编程语言组成的混合结构。它比自然语言更精确,描述算法很简洁;同时也可以很容易转换成计算机程序。虽然如此,但计算机科学家们从来就没有对伪代码的形式达成共识,不同作者的教材会设计他们自己的“方言”(伪代码)。幸运的是,这些伪代码都十分相似,任何熟悉一门现代变成语言的人都完全能够理解。
使用伪代码描述算法可以让程序员很容易将算法转换成程序,同时还可以避开不同程序语言的语法差别,如Pascal语言使用“:=”作为赋值,使用“=”作为比较;又如C/C++的赋值使用“=”,而判断相等的比较则是用“==”。
常用的微带关键词含义如下表所示:
伪代码含义C/C++语言
缩进
程序块
{}
/ /
行注释
/ /
←
赋值
=
=
比较运算——等于
==
≠
比较运算——不等于
!=
≤
比较运算——小于或等于
< =
≥
比较运算——大于或等于
>=
for i←1 to n do
For循环
for(i=1;i⇐n;i++){}
for i←n downto 1 do
For循环
for(i=n;i>=1;i–){}
while i
Wihle循环
while(i
do while i
Do-While循环
do {} while(i
repeat until i
Repeat循环
if i
If-Else语句
if(i
return
函数返回值
return
A[0..n-1]
数组定义
int A[n-1]
A[i]
引用数组
A[i]
SubFun()
函数调用
SubFun()
伪代码(Pseudocode)是一种算法描述语言。使用伪代码的目的是为了使被描述的算法可以容易地以任何一种编程语言(Pascal,C,Java,etc)实现。因此,伪代码必须结构清晰、代码简单、可读性好,并且类似自然语言。 介于自然语言与编程语言之间。
它以编程语言的书写形式指明算法的职能。相比于程序语言(例如Java, C++,C, Dephi 等等)它更类似自然语言。它是半角式化、不标准的语言。我们可以将整个算法运行过程的结构用接近自然语言的形式(这里,你可以使用任何一种你熟悉的文字,中文,英文 等等,关键是你把你程序的意思表达出来)描述出来. 使用伪代码, 可以帮助我们更好的表述算法, 不用拘泥于具体的实现.
人们在用不同的编程语言实现同一个算法时意识到,他们的实现(注意:这里是实现,不是功能)很不同。尤其是对于那些熟练于不同编程语言的程序员要理解一个(用其他编程语言编写的程序的)功能时可能很难,因为程序语言的形式限制了程序员对程序关键部分的理解。这样伪代码就应运而生了。
当考虑算法功能(而不是其语言实现)时,伪代码常常得到应用。计算机科学在教学中通常使用虚拟码,以使得所有的程序员都能理解。
综上,简单的说,让人便于理解的代码。不依赖于语言的,用来表示程序执行过程,而不一定能编译运行的代码。在数据结构讲算法的时候用的很多。
语法规则
例如,类Pascal语言的伪代码的语法规则是: 在伪代码中,每一条指令占一行(else if,例外)。指令后不跟任何符号(Pascal和C中语句要以分号结尾)。书写上的“缩进”表示程序中的分支程序结构。这种缩进风格也适用于if-then-else语句。用缩进取代传统Pascal中的begin和end语句来表示程序的块结构可以大大提高代码的清晰性;同一模块的语句有相同的缩进量,次一级模块的语句相对与其父级模块的语句缩进。
算法的伪代码语言在某些方面可能显得不太正规,但是给我们描述算法提供了很多方便,并且可以使我们忽略算法实现中很多麻烦的细节。通常每个算法开始时都要描述它的输入和输出,而且算法中的每一行都给编上号码,在解释算法的过程中会经常使用算法步骤中的行号来指代算法的步骤。算法的伪代码描述形式上并不是非常严格,其主要特性和通常的规定如下:
1) 算法中出现的数组、变量可以是以下类型:整数、实数、字符、位串或指针。通常这些类型可以从算法的上下文来看是清楚的,并不需要额外加以说明。
2) 在算法中的某些指令或子任务可以用文字来叙述,例如,"设x是A中的最大项",这里A是一个数组;或者"将x插入L中",这里L是一个链表。这样做的目的是为了避免因那些与主要问题无关的细节使算法本身杂乱无章。
3) 算术表达式可以使用通常的算术运算符(+,-,*,/,以及表示幂的^)。逻辑表达式可以使用关系运算符=,≠,,≤和≥,以及逻辑运算符与(and),或(or),非(not)。
4) 赋值语句是如下形式的语句:a
这里a是变量、数组项,b是算术表达式、逻辑表达式或指针表达式。语句的含义是将b的值赋给a。
5) 若a和b都是变量、数组项,那么记号ab 表示a和b的内容进行交换。
6) goto语句具有形式
goto label(goto标号)
它将导致转向具有指定标号的语句。
7) 条件语句有以下两种形式:
if c then s或者
if c then s
else s′
这里c是逻辑表达式,s和s′是单一的语句或者是被括在do和end之间的语句串。对于上述两种形式,假若c为真,则s被执行一次。假若c为假,则在第一种形式中,if语句的执行就完成了,而在第二种形式中,执行s′。在所有的情况下,控制就进行到了下一个语句,除非在s或s′中的goto语句使控制转向到其它地方。
8) 有两种循环指令:while和for。
while语句的形式是
while c do
s
end
这里c是逻辑表达式,而s是由一个或更多个语句组成的语句串。当c为真时,执行s。在每一次执行s之前,c都被检查一下;假若c为假,控制就进行到紧跟在while语句后面的语句。注意,当控制第一次达到while语句时,假若c为假,则s一次也不执行。
for语句的形式是
for var init to limit by incr do
s
end
这里var是变量,init、limit和incr都是算术表达式,而s是由一个或多个语句组成的语句串。初始时,var被赋予init的值。假若incr≥0,则只要var≤limit,就执行s并且将incr加到var上。(假若incr<0,则只要var≥limit,就执行s并且将incr加到var上)。incr的符号不能由s来该改变。
9) exit语句可以在通常的结束条件满足之前,被用来结束while循环或者for循环的执行。exit导致转向到紧接在包含exit的(最内层)while或者for循环后面的一个语句。
10) return用来指出一个算法执行的终点;如果算法在最后一条指令之后结束,它通常是被省略的;它被用得最多的场合是检测到不合需要的条件时。return的后面可以紧接被括在引号的信息。
11) 算法中的注释被括在/* */之中。诸如read和output之类的各种输入或者输出也在需要时被用到。
伪代码实例
伪代码只是像流程图一样用在程序设计的初期,帮助写出程序流程。简单的程序一般都不用写流程、写思路,但是复杂的代码,最好还是把流程写下来,总体上去考虑整个功能如何实现。写完以后不仅可以用来作为以后测试,维护的基础,还可用来与他人交流。但是,如果把全部的东西写下来必定可能会让费很多时间,那么这个时候可以采用伪代码方式。比如:
IF 九点以前 THEN
do 私人事务;
ELSE 9点到18点 THEN
工作;
ELSE
下班;
END IF
这样不但可以达到文档的效果,同时可以节约时间. 更重要的是,使结构比较清晰,表达方式更加直观.
下面介绍一种类Pascal语言的伪代码的语法规则。
在伪代码中,每一条指令占一行(else if 例外,),指令后不跟任何符号(Pascal和C中语句要以分号结尾);
书写上的“缩进”表示程序中的分支程序结构。这种缩进风格也适用于if-then-else语句。用缩进取代传统Pascal中的begin和end语句来表示程序的块结构可以大大提高代码的清晰性;同一模块的语句有相同的缩进量,次一级模块的语句相对与其父级模块的语句缩进;
在伪代码中,通常用连续的数字或字母来标示同一即模块中的连续语句,有时也可省略标号。
符号△后的内容表示注释;
在伪代码中,变量名和保留字不区分大小写,这一点和Pascal相同,与C或C++不同;
在伪代码中,变量不需声明,但变量局部于特定过程,不能不加显示的说明就使用全局变量;
赋值语句用符号←表示,x←exp表示将exp的值赋给x,其中x是一个变量,exp是一个与x同类型的变量或表达式(该表达式的结果与x同类型);多重赋值i←j←e是将表达式e的值赋给变量i和j,这种表示与j←e和i←e等价。
例如:
x←y
x←20*(y+1)
x←y←30
以上语句用C分别表示为:
x = y;
x = 20*(y+1);
x = y = 30;
选择语句用if-then-else来表示,并且这种if-then-else可以嵌套,与Pascal中的if-then-else没有什么区别。
例如:
if (Condition1)
then [ Block 1 ]
else if (Condition2)
then [ Block 2 ]
else [ Block 3 ]
循环语句有三种:while循环、repeat-until循环和for循环,其语法均与Pascal类似,只是用缩进代替begin - end;
例如:
1. x ← 0
2. y ← 0
3. z ← 0
4. while x < N
1. do x ← x + 1
2. y ← x + y
3. for t ← 0 to 10
1. do z ← ( z + x * y ) / 100
2. repeat
1. y ← y + 1
2. z ← z - y
3. until z < 0
4. z ← x * y
5. y ← y / 2
上述语句用C或C++来描述是:
x = y = z = 0;
while( z < N )
{
x ++;
y += x;
for( t = 0; t < 10; t++ )
{
z = ( z + x * y ) / 100;
do {
y ++;
z -= y;
} while( z >= 0 );
}
z = x * y;
}
y /= 2;
数组元素的存取有数组名后跟“[下标]”表示。例如A[j]指示数组A的第j个元素。符号“ …”用来指示数组中值的范围。
例如:
A[1…j]表示含元素A[1], A[2], … , A[j]的子数组;
复合数据用对象(Object)来表示,对象由属性(attribute)和域(field)构成。域的存取是由域名后接由方括号括住的对象名表示。
例如:
数组可被看作是一个对象,其属性有length,表示其中元素的个数,则length[A]就表示数组A中的元素的个数。在表示数组元素和对象属性时都要用方括号,一般来说从上下文可以看出其含义。
用于表示一个数组或对象的变量被看作是指向表示数组或对象的数据的一个指针。对于某个对象x的所有域f,赋值y←x就使f[y]=f[x],更进一步,若有f[x]←3,则不仅有f[x]=3,同时有f[y]=3,换言之,在赋值y←x后,x和y指向同一个对象。
有时,一个指针不指向任何对象,这时我们赋给他nil。
函数和过程语法与Pascal类似。
函数值利用 “return (函数返回值)” 语句来返回,调用方法与Pascal类似;过程用 “call 过程名”语句来调用;
例如:
1. x ← t + 10
2. y ← sin(x)
3. call CalValue(x,y)
参数用按值传递方式传给一个过程:被调用过程接受参数的一份副本,若他对某个参数赋值,则这种变化对发出调用的过程是不可见的。当传递一个对象时,只是拷贝指向该对象的指针,而不拷贝其各个域。
-
Scrum框架及其背后的原则(上)——Scrum框架的伪代码描述
2021-01-31 18:27:38 -
伪代码是什么?如何写一个伪代码?
2021-05-26 01:49:53伪代码是经常用于编程和基于算法的字段的术语;它是一种允许程序员表示算法实现的方法。简单地说,我们可以说它是算法的熟化表示。本篇文章就来带大家简单认识一下伪代码,介绍简单的C语言伪代码怎么写,希望对大家...伪代码是经常用于编程和基于算法的字段的术语;它是一种允许程序员表示算法实现的方法。简单地说,我们可以说它是算法的熟化表示。本篇文章就来带大家简单认识一下伪代码,介绍简单的C语言伪代码怎么写,希望对大家有所帮助。
伪代码是什么?
通常,算法是在伪代码的帮助下表示的,因为无论学习什么编程语言或掌握多深的编程知识,程序员都可以解释算法。顾名思义,伪代码是一种错误的代码的表示,即使是具有一些学校级编程知识的外行也可以理解。
算法:它是行动的有组织的逻辑序列或针对特定问题的方法。程序员实现一种算法来解决问题。算法使用自然语言但有些技术注释来表达。
伪代码:可以使用任何一种你熟悉的文字(中文,英文 等等,关键是你把你程序的意思表达出来)编写的注释和信息文本形式的算法实现。它没有任何编程语言的语法,因此无法由计算机编译或解释。
伪代码的优点
● 提高任何方法的可读性。这是开始实现算法的最佳方法之一。
● 充当程序与算法或流程图之间的桥梁。也可以作为一个粗略的文档,因此当写出伪代码时,可以很容易地理解一个开发人员的程序。在行业中,文档的方法是必不可少的。这就是伪代码证明至关重要的地方。
● 伪代码的主要目标是解释程序的每一行应该做什么,从而使程序员更容易构建代码构建阶段。
如何写一个伪代码?
下面是编写伪代码的标准:
1、安排任务序列并编写相应地伪代码。
2、从伪代码的声明开始,确定该伪代码主要目标。
3、通常用连续的数字或字母来标示同一模块中的连续语句,可省略标号。
4、在程序中缩进方式,这样有助于理解决策控制和执行机制,可以很大程度上提高了可读性。
5、详细说明实际代码中将要发生的一切,不要将伪代码抽象化。
6、循环语句有三种:while循环、repeat-until循环和for循环,其语法均与Pascal类似,只是用缩进代替begin - end;
7、变量不需声明,但变量局部于特定过程,不能不加显示的说明就使用全局变量;
8、赋值语句用符号←表示
x←y表示将y的值赋给变量x(注:y是一个与x同类型的变量或表达式);多重赋值i←j←e是将表达式e的值赋给变量i和j,这和j←e和i←e是等价的。
9、选择语句用if-then-else来表示,且可以嵌套。
10、符号△为注释符号,其后的内容表示已经注释的内容;
11、检查伪代码的所有部分是否完整,有限且清晰,以便理解。
12、不要以完整的编程方式编写伪代码;必须易于理解,因此不需要包含太多技术术语。
示例1:
伪代码:x←y
x←20*(y+1)
x←y←30
正常的代码:x = y;
x = 20*(y+1);
x = y = 30;
示例2:
伪代码:1. x ← 0
2. y ← 0
3. z ← 0
4. while x < N
1. do x ← x + 1
2. y ← x + y
3. for t ← 0 to 10
1. do z ← ( z + x * y ) / 100
2. repeat
1. y ← y + 1
2. z ← z - y
3. until z < 0
4. z ← x * y
5. y ← y / 2
正常的C语言代码:x = y = z = 0;
while( z < N ){
x ++;
y += x;
for( t = 0; t < 10; t++ ){
z = ( z + x * y ) / 100;
do {
y ++;
z -= y;
} while( z >= 0 );
}
z = x * y;
}
y /= 2;
以上就是本篇文章的全部内容,希望能对大家的学习有所帮助。更多精彩内容大家可以关注php中文网相关教程栏目!!!
-
matlab中伪代码-copula:MatlabCopula工具箱
2021-05-26 05:49:30matlab中伪代码概述 包含许多对Matlab中的关联建模有用的工具,而这些工具在统计和机器学习工具箱中并不直接存在。 重点是: 对于任何D> = 2,都可以通过Beta-Kernel平稳地进行经验语料密度估计。 任何D> = 2的经验... -
用伪代码描述算法PPT课件.pptx
2021-10-08 22:05:12用伪代码描述算法PPT课件.pptx -
Small-OS智能卡操作系统的用伪代码编程
2020-11-14 20:01:30于是,本节中所呈现的伪代码,就表现为一个良好的范例说明 智能卡操作系统中的进程是如何形式化描述的,伪代码在此以列表形式给出并附以详细的注释。类似形式的 表述可在EN 1546系列标准中找到,例如,其中智能卡... -
伪代码规则
2017-10-10 09:03:30伪代码是一种描述性语言,具体就是表明思路。因为可以在多个平台通用,所以就没用某个具体语言来写代码。 -
Scrum框架及其背后的原则(上)——Scrum框架的伪代码描述.pdf
2021-09-30 12:02:45Scrum框架及其背后的原则(上)——Scrum框架的伪代码描述.pdf -
11行伪代码给你讲明白什么是算法
2021-07-29 04:12:31它必须描述为一个有限步骤序列,且必须在有限时间内结束。每个步骤必须是良好定义的,达到人类可用一支笔和一张纸执行它的程度。算法基于我们提供给它的输入做一些事情,并生成反映其所做工作的一些输出。算法1-1...算法(algorithm)就是一个过程,是一种特殊的过程。它必须描述为一个有限步骤序列,且必须在有限时间内结束。每个步骤必须是良好定义的,达到人类可用一支笔和一张纸执行它的程度。
算法基于我们提供给它的输入做一些事情,并生成反映其所做工作的一些输出。算法1-1实现了我们前面描述的过程。
算法1-1 一个简单的股票跨度算法
SimpleStockSpan(quotes)→spans
输入: quotes,保存n个股票报价的数组
输出: spans,保存n个股票跨度的数组
spans←CreateArray(n) for i←0 to n do k←1 span_end ← FALSE while i-k ≥ 0 and not span_end do if quotes[i-k] ≤ quotes[i] then k←k+1 else span_end ← TRUE spans[i] ← k return spans
算法1-1展示了如何描述算法。我们并不使用某种计算机语言,因为那样会迫使我们处理与算法逻辑无关的实现细节,我们使用的是某种伪代码(pseudocode)形式。
伪代码是一种介于真正的程序代码和非形式化描述之间的形式。它使用一种结构化格式,并采用一组具有特定含义的词汇。但是,伪代码不是真正的计算机代码。它并不是为了被计算机执行,而是易于被人类理解。
顺便提一下,程序也应能被人类理解,但并非所有程序都是如此——有很多正在运行的计算机程序写得很糟糕,难以理解。
每个算法都有一个名字,接受一些输入,并生成一些输出。在本书中,算法的名字将采用骆驼拼写法(CamelCase),输入会写在括号中,输出用一个→指示。接下来的几行将会对算法的输入和输出进行描述。可以用算法的名字紧接放在括号中的输入来调用(call)算法。
一旦算法编写好,就可以将其作为一个黑盒来处理,可以给它一些输入,黑盒则会返回算法的输出。当用一种程序设计语言实现一个算法时,它就是一个具名的计算机代码片段——函数(function)。在一个计算机程序中,我们调用实现算法的函数。
某些算法不生成输出,当然也就不会显式返回结果。取而代之的是,它们的行为影响上下文的某部分。例如,我们可能提供给算法一个空间,供其写入结果。在此情况下,在传统意义上算法并非返回输出结果,但无论如何算法是有输出的,即它影响上下文发生的变化。
某些程序设计语言会区分显式返回结果的具名程序代码片段——称为函数(function),以及不返回结果但可能有其他副作用的具名程序代码片段——称为过程(procedure)。这种差异来源于数学,数学上的函数是必须返回值的。对我们来说,当一个算法编码为实际程序时,既可以是一个函数也可以是一个过程。
我们的伪代码中使用一些用粗体表示的关键字,如果你对计算机和程序设计语言的工作方式有所了解,这些关键字的含义就是不言自明的了。
我们使用字符←表示赋值,用等号(=)表示相等比较。我们采用常用的五个符号(+,-,/,×,·)表示四种数学运算,后两个符号都表示乘法,这两个符号我们都会使用,基于美学考虑进行选择。我们将不会使用任何关键字或符号对伪代码分块,分块是通过缩进来表示的。
在这个算法中,我们使用了数组(array)。数组是一种保存数据的结构,它允许我们按特定方式操纵其中的数据。我们保存数据并允许在其保存的数据上执行特定操作的结构称为数据结构(data structure)。因此数组是一种数据结构。
数组之于计算机,就像对象序列之于人类。数组是元素的有序序列,这些元素存储在计算机内存中。为了获得保存元素所需的空间并创建一个保存n个元素的数组,可调用算法1-1第1行中的CreateArray算法。
如果你熟悉数组,可能就会奇怪创建数组怎么还需要一个算法。但实际情况的确如此。为了获得保存数据的一块内存,你必须至少在计算机中搜索可用内存并标记它为数组所用。
CreateArray(n)调用做了所需的一切,它返回一个可容纳n个元素的数组,初始时其中没有元素,只有保存元素所需的空间。算法负责调用CreateArray(n)来将实际数据填充到数组中。
对数组A,我们用A[i]表示其第i个元素,访问该元素也是用该符号。一个元素在数组中的位置,如A[i]中的i,被称为索引(index)。一个n个元素的数组A包含元素A[0],A[1],…,A[n-1]。
这可能令你吃惊,因为其首元素是第0个,而尾元素是第n-1个,可能你的预期是第1个和第n个。但是,大多数计算机语言中的数组都是如此,你最好现在就熟悉这种机制。这非常常见,当遍历一个大小为n的数组时,我们是从位置0遍历到位置n-1。
在我们的算法中,当我们说某个对象的取值是从数x到数y(假定x小于y)时,意思是从x到y(但不包含)的所有值,参见算法第2行。
我们假定无论i的值是什么,访问第i个元素都花费相同的时间。因此访问A[0]与访问A[n-1]需要相同的时间。这是数组的一个非常重要的特性:对元素的访问是一致的,都花费常量时间。当我们通过索引访问数组元素时,数组不需要搜索此元素。
关于算法描述中的符号表示,我们用小写字母表示算法中的变量。但当变量表示一个数据结构时,我们会使用大写字母来令其突出,如数组A。但这并非必要。当我们希望给变量起一个包含很多单词的名字时,我们会使用下划线(_),如a_connector。这是必要的,因为计算机不理解由一组空格分隔的单词构成单个变量名的方式。
算法1-1使用数组保存数值。数组可以保存任何类型的项,在我们的伪代码中每个数组只能保存单一类型的项。大多数程序设计语言中也都是如此。
例如,可以创建十进制数数组、分数数组、表示人的项的数组以及另一个表示地址的项的数组,但不可以创建一个既包含十进制数又包含表示人的项的数组。至于“表示人的项”会是什么,由编程所使用的语言所决定。所有程序设计语言都提供表示有意义的东西的方法。
一种特别有用的数组是字符数组。一个字符数组表示一个字符串(string),即一个字母序列、一个数序列、一个单词序列、一个句子序列等。与所有数组一样,我们可以用索引单独引用数组中的单个字符。如果我们有一个字符串s=“Hello,World”,则s[0]为字母“H”而s[11]为字母“d”。
总结一下,数组就是一个保存相同类型项的序列的数据结构。数组支持两种操作:
CreateArray(n)创建一个能保存n个元素的数组。数组未初始化,即它不保存任何实际元素,但保存元素所需的空间已预留,可用来保存元素。
正如我们已经看到的,对一个数组A,A[i]访问其第i个元素,而且访问数组中任何元素都花费相同时间。若i<0,则试图访问A[i]会产生错误。
我们回到算法1-1。如前所述,算法第2~10行是一个循环,即一个反复执行的代码块。如果我们有n天的报价的话,循环执行n次,每次计算一个跨度。变量i表示我们正在计算跨度的当前这一天。初始时,处于第0天这一最早的时间点。每次执行第2行代码时,就会推进循环到第1,2,…,n-1天。
我们使用变量(variable)k指示当前跨度的长度——在我们的伪代码中,变量就是一个引用某些数据的名字,那些数据的内容,或者更精确地说,变量的值(value),在算法执行的过程中是可以改变的,变量这个术语因而得名。当我们开始计算一个跨度时,k的值总是1,我们是在第3行设置这个初值的。
我们还使用了一个指示变量(indicator variable)span_end。指示变量取值TRUE或FALSE,指出某事成立或不成立。当我们到达一个跨度的末端时,变量span_end的值将为真。
在开始计算每个跨度时,span_end为假,如第4行所示。第5~9行的内层循环计算跨度的长度。第5行告诉我们,只要跨度还未结束,就回退尽可能长的时间。我们能回退多远由条件i-k≥0决定:回退到索引i-k指示的这一天检查跨度是否结束,而索引不能为0,因为0对应第1天。
第6行检查跨度是否结束。如果跨度未结束,则在第7行增加其长度。否则,我们注意到,第9行设置跨度结束,从而循环会在回到第5行后终止。
第2~10行的外层循环在第10行结束一次循环时,我们在此将k的值保存到数组spans的正确位置。在退出循环后的第11行,我们返回spans,它保存着算法的结果。
注意,初始时我们设定i=0和k=1。这意味着在最早的时刻第5行的条件必定为假。这是理所应当的,因为第0天的跨度只能为1。
此时此刻,记住我们曾说过的关于算法、笔和纸的内容。理解一个算法的最好方法就是去手动执行它。
在任何时候如果一个算法看起来有些复杂,或者你不确定是否已完全理解它,就用纸和笔写下执行它求解某个例子的过程。这种方法会节省你很多时间,虽然它看起来有点老套。如果对算法1-1还有不明确的地方,马上尝试这种方法,当算法已完全清晰后再回到这里。
关于作者:帕诺斯·卢里达斯(Panos Louridas),曼彻斯特大学软件工程博士,现为雅典经济与商业大学管理科学与技术系副教授。在加入高校之前,曾在投资银行担任高级软件工程师。
-
基于XML的在线伪代码编辑与转换器的研究 (2011年)
2021-05-07 08:04:49针对目前科研工作者迫切需要能够在线快速编辑伪代码并且能够把伪代码转换成完整可编译源代码的网络工具,本文提出了基于...伪代码采用XML文件描述和存储,通过DOM4J来对XML文件进行解析,从而实现伪代码的多次编辑与转换。 -
Java伪代码示例
2021-03-16 03:59:10代码实现; //剩下的就是体力活了 } if(如果你上来就敲)System.out.println("你就是加班最多的程序员"); //积极工作和勤于思考都要占时间 } 原文:https://www.cnblogs.com/baxianhua/p/9408715.html -
爬山法伪代码+示意图.ai(寻优算法“爬山法”可编辑AI文件)
2021-08-03 17:22:41爬山法伪代码+示意图.ai(寻优算法“爬山法”可编辑AI文件) -
求冒泡排序的全中文的伪代码 ?
2021-05-24 04:25:44满意答案haoy4020推荐于 2017.11.25采纳率:53%等级:9已帮助:913人伪代码啊,还真不好描述:假设有N个数,可以想象成所有的数分成两部分:上部和下部,上部的是排好序的,下部的没有。外层循环N-1次(i从0到N-2){ /... -
缴费系统伪代码
2012-12-15 23:15:40针对物业管理系统写的缴费模块伪代码,欢迎指导 -
java伪代码怎么写
2021-03-05 18:00:301. 请把下面的java代码用伪代码写出来伪代码(Pseudocode)是一种算法描述语言。使用伪代码的目的是为了使被描述的算法可以容易地以任何一种编程语言(Pascal,C,Java,etc)实现。因此,伪代码必须结构清晰、代码简单、... -
什么是伪代码,它如何使你成为更好的程序员?
2021-01-22 14:23:56通过学习伪代码来掌握代码。但是什么是伪代码,它真的有帮助吗? 当你第一次开始学习编程时,在构建第一个应用程序之前,需要学习很多东西。像程序员一样思考可以帮助你将问题分解为算法来解决问题。算法是你的... -
伪代码书写格式
2021-07-17 00:51:461、精品文档伪代码伪代码是用介于自然语言和计算机语言之间的文字和符号来描述算法。每一行(或几行)表示一个基本操作。它不用图形符号,因此书写方便、格式紧凑,也比较好懂,便于向程序过渡。伪代码的7个主要部分:... -
论文中伪代码怎么写
2021-07-22 05:42:231.tex中怎么在论文中写算法的伪代码伪代码的语法规则在伪代码中,每一条指令占一行(else if 例外,),指令后不跟任何符号(Pascal和C中语句要以分号结尾);书写上的“缩进”表示程序中的分支程序结构.这种缩进风格也... -
伪代码描述归并排序算法
2015-09-24 19:50:45都说实践是最好的老师,所以我希望通过对算法的描述来学习伪代码。百度百科上介绍,伪码(Pseudocode)是一种算法描述语言。使用伪码的目的是使被描述的算法可以容易地以任何一种编程语言(Pascal,C,Java等)实现... -
算法中的伪代码语法格式 - 算法实现表达利器
2021-06-14 21:28:15对于熟练不同编程语言的程序员要理解其他编程语言编写的功能时很困难,而伪代码清晰、简单、可读性好,可将整个算法运行过程的结构用接近自然语言的形式描述出来。伪代码不关心软件工程的问题,常忽略数据抽象、模块... -
分治策略详解 算法及伪代码 选择 排序 ppt
2014-04-10 11:31:452.1.1 分治算法的一般性描述 2.2 分治算法的分析 2.3 改进分治算法的途径(不做要求) 2.3.1 通过代数变换减少子问题个数 2.3.2 利用预处理减少递归内部的计算量 2.4 典型实例 2.4.1 求最大最小元 2.4.2 排序问题... -
伪代码撰写规范
2021-05-26 02:55:12前言伪代码是半角式化、不标准的语言。我们可以通过它将整个算法运行过程的结构用接近自然语言的形式描述出来(这里,你可以使用任何一种你熟悉的文字,中文,英文等等,关键是你把你程序的意思表达出来)。 借助伪... -
伪代码的写法
2020-12-05 09:32:59伪代码(Pseudocode)是一种算法描述语言。使用伪代码的目的是为了使被描述的算法可以容易地以任何一种编程语言(Pascal,C,Java,etc)实现。因此,伪代码必须结构清晰、代码简单、可读性好,并且类似自然语言。 介于... -
机器学习算法-KMeans聚类算法解析及伪代码实现。
2021-01-15 03:12:15机器学习算法-KMeans聚类算法解析及伪代码实现。徐小狗在文末附上了几条大神们关于KMeans聚类算法的博文,欲详细研究请前往浏览~作为初学者,许多地方可能笨拙或有误,希望有大神看到后给予优化和指点!~Why – ...