从现在开始,我们要利用一个测试用例——具体的输入——来一步一步地运行顺序查找算法的流程,这叫作逐行调试该算法。逐行调试的英文为walk through,也就是“一步一步运行”的意思。
测试用例如下,算法的输入为:
也就是从
这5个数中通过顺序查找算法来查找26这个数。
从行L1开始运行顺序查找算法的流程。
这一行的意思是:名为LINEAR-SEARCH的
流程
即将开始。流程用英语表示为procedure。此外,这一行还表示该流程被给予了输入
、
和
。
接着运行下一行L2。
在这一行,我们将变量
赋值
为1。运行这一行后,变量
的值变为1。
变量
表示我们正在注视数列中的第
个数。
接着运行下一行L3。
在这一行,我们将判断
循环
的条件。关键字
表示,在满足条件期间,循环运行从
至
的各行。此处的条件为“
”。
因为变量
表示数列的大小,所以条件
表示“将注视的位置限定在数列的范围内”。严格来说条件应该为
,但因为变量
从1开始增加,所以只要将
的上限设为
即可。
此时,因为
,所以满足条件
。
因为满足条件,接着运行下一行L4。
在这一行,我们将判断条件。关键字
表示,只有满足条件时,流程才会运行从
至
的各行。此处的条件为
。
条件
表示“正在注视的数与要查找的数相等”。
因为此时
,根据输入的数列得出
,即
,而
,不满足条件
。
数列的第1个数并不是我们想要查找的数。
因为不满足条件,所以直到
的所有行都要跳过。
这样,我们“嘣”地就跳到了行L7。
在这一行,我们将式子
赋值给变量
。当前
,因此式子
的值为2,变量
的值由1变为2。
这样,我们注视的位置就向后移动了一位。
接着运行下一行L8。
这一行的
与行L3的
相对应。
现在返回至行L3。
◎ ◎ ◎
“泰朵拉,你真是用心学习了啊。”我佩服地说。
“有、有吗……”泰朵拉支支吾吾,脸红红的。
“你穿插着解释了形式和含义,也就是程序字面上的意思和算法的思想,这样的讲解方式非常有趣。”
“啊……”面对突如其来的夸奖,泰朵拉好像不知道说什么好。
“但是,还是觉得好麻烦啊。”我一边说,一边看着泰朵拉的笔记本,上面详细记录着伪代码的说明。
“确实呢。不过只要下定决心,一边记录变量的值,一边按部就班地运行,也没有那么麻烦啦……”
“Continue。”理纱说。
◎ ◎ ◎
回到行L3,重新判断循环条件。
现在,因为
,所以满足条件
。
接着运行下一行L4。
再一次判断条件,现在变量
的值等于2,不满足条件
,因为此时
作为输入其值为41,而
的值为26。
数列的第2个数也不是我们想要查找的数。
因此,我们跳过行L5和行L6,直接转到行L7。
变量
的值再次增加1,现在变量
的值变为3。
接着运行下一行L8。
再一次回到行L3。
◎ ◎ ◎
“重复做同一件事情呢。”我说。
“嗯。”泰朵拉接着说,“但是
的值增加了吧。”
“Continue。”理纱的语气毫无起伏。
◎ ◎ ◎
现在,因为
,所以满足条件
。
接着运行下一行L4。
现在
,不满足条件
,因为此时
作为输入其值为59,而
的值为26。
跳转至行L7。
变量
的值变为4。
接着运行下一行L8。
再一次回到行L3。
◎ ◎ ◎
“还在重复做同一件事情呢。”我说。
“嗯。”泰朵拉接着说,“但是,
的值在增加啊。”
“Continue。”理纱的语气依旧毫无起伏。
◎ ◎ ◎
现在
,满足条件
。
接着运行下一行L4。
现在
,条件
成立
!因为
的值与26相等,我们终于满足了
的条件。
向行L5前进。
“能找到”
是表示本流程输出的关键字。我们将运行结果设置为“能找到”,然后跳转至行L10:
。
至此,LINEAR-SEARCH流程结束。
好,就像这样,经过从
到
总共18个步骤,算法运行完成。由输入的值
得到的输出为“能找到”。
◎ ◎ ◎
“真是辛苦啊。”我说。
“呼……是啊。”泰朵拉说,“仅仅是为了判断‘在
中是否存在26’,就要下这么一番工夫,变量
的值也在流程运行过程中改变了很多次,真是烦琐。”
“那么具体的动作是怎样的呢?”
“嗯,现在我们按逐行调试时的运行顺序给各行标上序号,就像这样。这便是旅行的足迹,对吧!”
逐行调试顺序查找算法
(输入为
)
“原来如此……”
“计算机先生真厉害!无论重复多少遍相似的工作也不会厌倦。”
“呃,其实我觉得泰朵拉你的毅力也很值得钦佩。”我说。
“泰朵拉计算机。”理纱说。