ACM
BLOG@CACM

正确编写程序(5)

我们到了吗?

Bertrand Meyer"src=

是的,我知道,这事拖得太久了。但这是想法的一部分:显示出如果你只是凭你的直觉判断一个程序是多么困难。也许这次我们能做对?

这是关于一个看似naïve的问题的第五篇文章:我们如何编写二进制搜索程序?第一篇文章出现了在这里.前三次程序尝试都是错误的。的第四条摒弃了另一种变体,又引入了另一种:

——程序尝试4号。

I:= 0;J:= n + 1

直到我=我循环

M:= (i + j) // 2

如果T [m]≤x然后

I:= m + 1

其他的

j: = m

结束

结束

如果1而且n然后结果: =我结束

我们到了吗?这个说法最终正确了吗?

抱歉让你失望了,但是不行。考虑一个双元素数组T = [0 0],所以n = 2,和一个搜索值x = 1(是的,和上次一样的反例,虽然这里我们也可以用x = 0).变量和表达式的连续值为:

M I j I + j

在初始化:0 3 3

我≠j,因此输入loop:12 35——第一个分支如果

我≠j,再次输入loop:23.3.6——又是第一个分支

I = j,退出循环

“最后的条件”如果是真的,所以结果获取值3。这是完全错误的,因为位置3没有元素,而且在任何情况下x不会出现在t

但是我们已经很接近了!某物就像应该工作,不是吗?

所以耐心点,耐心点,让我们再稍微调整一下,好吗?

——程序尝试5号。

I:= 0;j: = n

直到≥j或结果> 0循环

M:= (i + j) // 2

如果T [m] < x然后

I:= m + 1

elseifT [m] > x然后

j: = m

其他的

结果m: =

结束

结束

现在有用吗?周一的答案。(对生命中终极真理的探索没有周末,但我必须等待ACM友好的工作人员,确保每篇文章都正确注册和链接。)

出版报告:宣布的第六篇(“星期一”)文章已经发表在这里

Bertrand Meyer首席技术官是谁埃菲尔铁塔的软件(Goleta, CA),沙夫豪森理工学院(瑞士)教授和教务长,俄诺波利斯大学(俄罗斯)软件工程实验室负责人。


没有发现记录

登录为完全访问
»忘记密码? »创建ACM Web帐号
Baidu
map