TAOCP-Reading-计算机程序设计艺术阅读-1-1

本文详细介绍了计算机程序设计艺术中的欧几里得算法,用于求解两个正整数的最大公约数。通过E1、E2、E3三个步骤阐述算法过程,并讨论了算法表示方法、赋值与比较的区别,以及代码可读性的提升。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上来就是欧几里得,你怕不怕?

上一篇:https://blog.youkuaiyun.com/qq_43057060/article/details/95171427

正文

Algorithm EEuclid’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)这样我们就可以用图形化的方式来让算法更可读

Created with Raphaël 2.2.0 E E1 E2 return n E3 yes no
图一:欧几里得算法的流程图

图一:
在将算法归结为对数据和符号的操作(赋值,函数,±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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值