0

我正在学习计算机科学(远程学习)并且对出现在教科书中但没有答案的“额外信息问题”感到困惑。这是关于线性搜索算法和短路评估的。

书中线性搜索的算法是这样写的:

指针 = 0
WHILE 指针 < LengthOfList AND list[pointer] != searchedfor:
------ 指针加一
ENDWHILE

IF 指针 >= LengthOfList THEN:
------- PRINT("项目不在列表中")
ELSE
------- PRINT("项目在位置 " +pointer)
ENDIF


在额外的信息框中,它讨论了短路评估以及当布尔运算符链接多个部件时,计算机如何仅在必要时评估第二个条件。所以我得到了条件 1 和条件 2(使用短路评估时)如果条件 1 为假,则不会评估条件 2。

但是它随后会询问
“如果线路中未使用短路评估,您能否发现可能发生的运行时错误:

WHILE 指针 < LengthOfList AND list[pointer] != 搜索“

在过去的两周里,我一直在搜索并寻找答案,并在纸上一遍又一遍地用不同的项目运行算法,但我无法弄清楚运行时错误可能是什么。任何人都可以看看他们是否能发现这个错误并向我解释吗?非常感谢。

4

1 回答 1

0

我认为这个问题需要在这里重新评估。首先,让我们定义短路评估。短路评估是使用布尔运算符,例如&&(AND 运算符)和||(OR 运算符),因此由于一个参数的结果,只需检查两个参数中的一个。例如,考虑这些示例 whereABare 条件,

if(A && B)

根据短路评估,如果 A 为假,则永远不必检查 B,因为A && B无论 B 是什么,总体结果都是假的,并且 if 语句的主体将被跳过。

if(A || B)

这里根据短路评估,如果 A 为真,则永远不必检查 B,因为A || B无论 B 是什么并且执行 if 语句的主体,总体结果都为真。

现在的问题是如果使用短路评估会发生什么。所以问题只是询问不同编写算法的错误(注意你上面写的算法完全没问题)。本质上,如果每次迭代都检查 while 循环中的两个条件,会发生什么错误?因为现在,防止运行时错误的是,在最后一次迭代中,只检查第一个条件以防止ArrayIndexOutOfBoundsException. 如果 while 循环的最后一次迭代检查了这两个条件,则将发生运行时错误,因为程序试图访问数组边界之外的元素。

于 2016-05-02T22:38:34.053 回答