上来就是欧几里得,你怕不怕?
上一篇:https://blog.youkuaiyun.com/qq_43057060/article/details/95171427
正文
Algorithm E(Euclid’s Algorithm).已知两个正整数m和n,求他们的最大公约数,就是说,最大的,可以被m和n整除的数
E1[求余]将r设为m/n的余数(在此之后,将会有0<=r<n)
r=m%n
E2[是否为零]如果r=0,结束此算法,n为解
if(r=0)return n;
E3[更新状态]m <- n;n <- r;跳转到E1
m=n;n=r;goto E1
//这是作者(不是高德纳)给出的示例代码
public int gcd(int m,int n){
int r;
while(true){
r=m%n;
if(r==0)return n;
m=n;n=r;
}
}
当然,欧几里得不是这么写的,但我会把之后的所有算法都用这种方法表示出来。
对于所有的算法我都会给它一个唯一的ID字母(比如这里的E),
并且它的每一步的标识都会是此字母+一个数字(E1,E2,E2)
章被分为数个由‘.’作为标识的节。在同一节中,算法的编号将只有一个字母,而在其他节中,算法的标识将会是节号+字母。
比如说,我们现在是第1.1节,在这一节,欧几里得算法被称为算法E,在以后的节中,欧几里得算法的编号就会是算法1.1E
算法的每一步,比如说E1,将会由一对方括号开始,里面包括对此步骤的概括,此词通常会在此算法的流程图中出现。像(图1)这样我们就可以用图形化的方式来让算法更可读
图一:欧几里得算法的流程图 |
---|
图一:
在将算法归结为对数据和符号的操作(赋值,函数,±x/)和一些选择(if)之后。()内的注释,就像E1的第二句句子
"(在此之后,将会有0<=r<n)"
将会出现。注释将包含关于此步的解释性信息,通常包含关于当前变量或目标的不变的特征
(无论m和n是哪两个正整数,对于m除以n的余数m%n,总有0<=m%n<n,不是吗)
它们对于代码的行为没有影响,但它们使代码的阅读者更容易看懂并理解代码。
E3中的 <- 指最重要的替换,有时称为置换或赋值:“m <- n”的意思是将变量m的值设为变量n的值。在算法E开始时,m和n的值是初始给定的值(实参),但当它结束时,一般来说,这些变量将会有不同的值.
连个赋值都这么复杂,果然是高德纳
一个箭头(" <- “)用于区别赋值和比较(=和==):我们不会说"设x=y”,但可能会问"x=y吗?"
在座放心,我从下一章开始不会用<-的,因为那输入法不友好,我还是会用 =和==
所以 = 表示一个可以被测试的条件, <- 表示一个可以被执行的操作.将n加一的操作表示为n <- n+1(读作“n被替换为n+1”或者“n gets n+1”)一般来说,"变量 <- 表达式"的意思是用表达式中出现的变量的当前值进行计算,再用结果把 <- 左边的变量的值替换掉.没有经过编程训练的人有时倾向于"n变成n+1"之类的写法,并把代码写成n -> n+1 来完成N+=1的功能.
连个++i都能说这么多,再来一个膝盖.
顺便水水字数
这样的语法只能导致混乱,应为它和标准语法冲突,并且它应当被拒绝.
今天就到这儿了,下篇继续
Thanks For Reading
下一篇:https://blog.youkuaiyun.com/qq_43057060/article/details/95490588