《算法基础》——1.3 伪代码

1.3 伪代码

为了使本书中描述的算法尽可能有用,首先我们用直观的术语来描述它们。有了这个高层次的解释,可以能够用大多数的编程语言来实现这些算法。
然而,一个算法的实现经常包含很多难以实现的琐碎细节。为了使这些细节易于处理,算法也用伪代码来描述。伪代码是很像编程语言但又不是真正的编程语言的一种文本。伪代码提供了代码实现算法过程中会用到的结构和细节,同时又不与某种特定的编程语言联系在一起。希望你能把这些伪代码翻译成真正的代码,然后在你的计算机上执行。
下面的代码片段展示了计算两个整数的最大公约数(GCD)算法的伪代码示例:

取模操作
取模操作,在伪代码中写作Mod。它意味着整除之后的余数。比如说,13 Mod 4=1。因为13被4除,商是3,余数是1。

伪代码以一个注释开头。注释以字符“//”开始然后延伸到这一行的结束。
代码实际的第一行是算法的声明。这个算法叫做Gcd(最大公约数),它返回了一个整数结果。它有两个名为a和b的整数参数。
注 执行一个任务或者有选择地返回一个结果的一块代码称为例程、子例程、方法、过程、子过程或者函数。
声明之后的代码缩进以显示它是方法的一部分。方法主体的第一行以一个While循环开始。
只要While语句的条件保持为真,While下缩进的代码就会被执行。
While循环在End While语句处结束。End While语句并不是严格需要的,因为缩进显示了循环结束的地方,但是它(End While)提醒了什么样的语句块将要结束。
这个方法在Return语句处退出。这个算法返回了一个数值,所以这个Return语句表明了该算法应该返回哪个值。如果这个算法没有返回任何数值,例如,如果其目的是排列数值或者建立一个数据结构,那么Return语句执行后就没有任何返回值。
这个例子中的伪代码非常接近于实际的编程代码。其他的例子可能包含自然语言描述的指令和数值,这种情况下,指令用尖括号(< >)括起来,以表示需要把这些自然语言形式的指令翻译成程序代码。
通常,当声明一个参数或变量时(在Gcd算法中, 这包括参数a和b以及变量remainder),会在它前面给出数据类型,数据类型后面跟着一个冒号,如Integer: reminder。对于简单的整形循环变量,数据类型可能会被省略,如For i = 1 To 10。
伪代码不同于某些编程语言的另一个特点是它的For循环可能包含一个Step语句,用以表明循环变量每个循环后改变的数值。For循环以Next i语句结尾(i是循环变量),用来提醒你哪一个循环结束了。
例如,请思考下列的伪代码:

本书中用的伪代码使用If-Then-Else语句、Case语句和其他需要的语句。从对于真正编程语言的了解来看,读者应该很熟悉这些语句。伪代码需要的别的东西都用英语阐明。
链表(List)是一个对你来说可能不熟悉的基础数据结构。链表类似于一个自我扩展的数组。它提供了一个Add方法让用户向链表的末尾添加元素。下面的伪代码建立了一个包含数字1到10的整数链表:

在链表被初始化之后,伪代码可以像普通数组一样使用它并从链表的任意位置获取元素。与数组不同的是,链表也允许你在任何位置添加或删除元素。
本书中的许多算法被写成返回一个结果的方法或函数。方法声明的开头是结果的数据类型。如果一个方法执行了一些任务而没有返回一个结果,那么它就没有数据类型。
下列的伪代码包含了两个方法:

DoubleIt方法接受一个整数作为参数然后返回了一个整数值,这段代码加倍了输入值并返回了结果。
DoSomething方法接受一个叫做value的整数数组作为参数,它执行了一个任务但是没有返回结果。例如,它可能会随机化或排列数组中的元素。(注:本书假定数组从下标0开始。例如,一个有三个元素的数组有下标0、1、2。)
伪代码应该是很直观并易于理解的,但是如果你发现一些无法理解的东西,请在这本书的讨论论坛上发帖提出问题或者发送邮件到RodStephens@CSharpHelper.com,我会给你指出正确的方向。
伪代码存在一个问题:没有任何编译器来检测错误。作为对基础算法的检测,本书同时给你一些实际的代码作为参考,C#实现的算法和许多练习可以在本书的网站上下载。

时间: 2024-07-28 16:38:20

《算法基础》——1.3 伪代码的相关文章

《算法基础》——导读

**前言**算法是使高效的程序成为可能的方法.它们解释了如何排列记录.搜索项.计算数值(比如质因子分解).查找一个街道网络中的最短路径.确定可能通过通信网络的最大流.算法好坏的差别可能意味着是在一秒.一个小时内解决问题,还是永远也不能解决问题.学习算法使你能建立有用的方法工具来解决具体的问题.它能帮助你理解在不同的情况下,哪个算法是最有效的,所以对于一个特定的问题,你就能选择最适合的算法.对某些数据而言性能优异的算法可能对其他的数据而言表现糟糕.所以知道如何选择一个最适合当前情况的算法是很重要的

一道算法基础题 uva1586

问题描述 一道算法基础题 uva1586 题目链接在这儿 http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=830&page=show_problem&problem=4461 我自己做的代码如下 但是通不过 测了好多数据都没问题 #include<cstdio> #include<cstring> using namespace std; in

《算法基础:打开算法之门》一2.1 如何描述计算机算法

2.1 如何描述计算机算法 将计算机算法描述成一个可执行程序可以有多种选择,例如使用通用的编程语言表示,像Java.C.C++.Python或Fortran.诚然,许多教科书上的算法都是这么表示的.但是使用实际的编程语言来表示算法所带来的问题是你可能会在语言细节上越陷越深,而对算法本身的认识反而模糊不清.另一种表示算法的方式是"伪代码",就像我们在<算法导论>中使用的一样,它听起来像是多种编程语言和英语的混合表示.如果你曾用一种实际的编程语言编写过程序,那么你就能很容易地搞

java 算法基础之二快速排序算法

http://www.cnblogs.com/hexiaochun/archive/2012/09/03/2668324.html java 算法基础之二快速排序算法 所谓的快速排序的思想就是,首先把数组的第一个数拿出来做为一个key,在前后分别设置一个i,j做为标识,然后拿这个key对这个数组从后面往前遍历,及j--,直到找到第一个小于这个key的那个数,然后交换这两个值,交换完成后,我们拿着这个key要从i往后遍历了,及i++;一直循环到i=j结束,当这里结束后,我们会发现大于这个key的值

《算法技术手册》一第3章 算法基础

第3章 算法基础 虽说开发软件是为了解决问题,但程序员们往往太执着于是否能够解决问题本身,而不去确认这一问题是否已有解决之法.即便程序员们知道前人已在类似情况下解决了问题,但"已有的解决之法"最终是否适用于特写的问题仍是一个未知数.更重要的是,要找到完全不需要修改或者只需要稍作修改便能解决手头问题的代码并不容易.不同的人对待算法的态度各有千秋.很多人就只是简单地在一本书中或者网站上找个算法,复制代码,运行一次,然后可能还会测试一次,如果结果正确,就开始做下一个任务.但是,在我们看来,这

《算法基础》——第1章 算法基础知识 1.1 方法

第1章 算法基础知识 在开始算法学习之前,你需要一点背景知识.简单地说,首先需要知道的是算法是完成某些事情的方法.它定义了用某个方法执行一个任务的步骤.这个定义看起来足够简单,但是没有人为了做一件十分简单的工作而写算法.没有人写指令来获取数组中的第四个元素.这只是假设这是一个数组定义的一部分,并且你知道怎么去做(如果你知道如何在这个问题中使用编程语言).一般来说,人们只是为了完成复杂的任务而写算法.算法解释了如何找到一个复杂代数问题的答案,如何在一个包含数千条街道的网络中找到最短路径,抑或是如何

《算法基础:打开算法之门》一3.5 快速排序

3.5 快速排序 像归并排序那样,快速排序也使用分治模式(因此也使用递归).然而,快速排序与归并排序所使用的分治法稍微有点不同.与归并排序相比,存在两个不同之处: ●快速排序按照原址工作. ●快速排序的渐近运行时间介于最坏情况和平均情况之间.尤其是,快速排序的最坏运行时间是Θ(n2),但是它的平均情况下的运行时间要更好一些:Θ(nlgn).快速排序也有好的常数因子(比归并排序更好一些),并且它通常是实践中的一个好的排序算法.这里是快速排序使用分治法的过程.再一次考虑对书架上的书进行排序的例子.就

《算法基础:打开算法之门》一导读

前言 Algorithms Unlocked 计算机是如何解决问题的呢?小小的GPS是如何只在几秒钟内就从无数条可能路径中找出到达目的地的最快捷路径的呢?在网上购物时,又如何防止他人窃取你的信用卡账号呢?解决这些问题,以及大量其他问题的答案均是算法.我写本书的目的就是为你打开算法之门,解开算法之谜. 我是<算法导论>的合著者之一.<算法导论>是一本特别好的书(当然,这是我个人的主观评价),但是它确实相当专业. 本书并不是<算法导论>,甚至不能被称为一本教材.它既没有对计

《算法基础》——3.5 链表算法

3.5 链表算法 到目前为止,本章描述了一些用于建立和维护链表的算法,包括在链表的开头.结尾和中间添加项的算法,查找链表中项的算法和从链表中删除项的算法. 以下各节描述了利用其他方式来操作链表的算法.3.5.1 复制链表 一些算法重新排列链表.本节和下一节将描述一些对链表中的项进行排序的算法.如果想保持原来链表的顺序,就必须在排序之前就做一个该链表的副本. 下面的伪代码演示了如何复制一个单链表: 该算法相当简单,但有一点值得一提:该算法使用last_added来跟踪最新被加入到链表副本中的单元格