线性搜索和短路评估(运行 时间误差)
Linear Search and Short Circuit Evaluation (run time error)
我正在学习计算机科学(远程学习),对教科书上出现但没有答案的"extra info question"感到困惑。这是关于线性搜索算法和短路评估。
书上线性搜索的算法是这样写的:
指针 = 0
WHILE pointer < LengthOfList AND list[pointer] != searchedfor:
------ 指针加一
结束时
如果指针 >= LengthOfList 那么:
------ 打印("Item is not in the list")
其他
------ 打印("Item is at location " +指针)
ENDIF
在额外的信息框中,它讨论了短路评估以及当有多个部件通过布尔运算符链接时,计算机如何仅在必要时评估第二个条件。所以我得到了条件 1 和条件 2(当使用短路评估时)如果条件 1 为假,则不会评估条件 2。
然而它随后询问
“你能发现如果线路中未使用短路评估可能发生的 运行 时间错误吗:
WHILE pointer < LengthOfList AND list[pointer] != searched for "
在过去的 2 周里,我反复搜索并寻找答案并 运行 通过纸上不同项目的算法一遍又一遍,但我无法理解 运行 时间错误可能是。谁能看看他们是否能发现这个错误并向我解释?非常感谢。
我认为这里需要重新评估这个问题。首先,让我们定义短路评估。短路评估是使用布尔运算符,例如 &&
(AND 运算符)和 ||
(OR 运算符),因此由于一个参数的结果,只需检查两个参数之一争论。例如,考虑这些示例,其中 A
和 B
是条件,
if(A && B)
根据短路评估,如果 A 为假,则永远不必检查 B,因为无论 B 是什么,A && B
的总体结果都是假的,并且将跳过 if 语句的主体。
if(A || B)
此处根据短路评估,如果 A 为真,则永远不必检查 B,因为无论 B 是什么以及执行 if 语句的主体,A || B
的总体结果都是真。
现在的问题是如果不使用短路评估会发生什么。所以问题只是询问不同编写算法的错误(注意你上面写的算法完全没问题)。本质上,如果每次迭代都检查 while 循环中的两个条件,会发生什么错误? 因为现在,防止运行时错误的是在最后一次迭代中,只有第一个条件检查以防止 ArrayIndexOutOfBoundsException
。如果 while 循环的最后一次迭代检查了这两个条件,则会发生运行时错误,因为程序试图访问数组边界之外的元素。
我正在学习计算机科学(远程学习),对教科书上出现但没有答案的"extra info question"感到困惑。这是关于线性搜索算法和短路评估。
书上线性搜索的算法是这样写的:
指针 = 0
WHILE pointer < LengthOfList AND list[pointer] != searchedfor:
------ 指针加一
结束时
如果指针 >= LengthOfList 那么:
------ 打印("Item is not in the list")
其他
------ 打印("Item is at location " +指针)
ENDIF
在额外的信息框中,它讨论了短路评估以及当有多个部件通过布尔运算符链接时,计算机如何仅在必要时评估第二个条件。所以我得到了条件 1 和条件 2(当使用短路评估时)如果条件 1 为假,则不会评估条件 2。
然而它随后询问
“你能发现如果线路中未使用短路评估可能发生的 运行 时间错误吗:
WHILE pointer < LengthOfList AND list[pointer] != searched for "
在过去的 2 周里,我反复搜索并寻找答案并 运行 通过纸上不同项目的算法一遍又一遍,但我无法理解 运行 时间错误可能是。谁能看看他们是否能发现这个错误并向我解释?非常感谢。
我认为这里需要重新评估这个问题。首先,让我们定义短路评估。短路评估是使用布尔运算符,例如 &&
(AND 运算符)和 ||
(OR 运算符),因此由于一个参数的结果,只需检查两个参数之一争论。例如,考虑这些示例,其中 A
和 B
是条件,
if(A && B)
根据短路评估,如果 A 为假,则永远不必检查 B,因为无论 B 是什么,A && B
的总体结果都是假的,并且将跳过 if 语句的主体。
if(A || B)
此处根据短路评估,如果 A 为真,则永远不必检查 B,因为无论 B 是什么以及执行 if 语句的主体,A || B
的总体结果都是真。
现在的问题是如果不使用短路评估会发生什么。所以问题只是询问不同编写算法的错误(注意你上面写的算法完全没问题)。本质上,如果每次迭代都检查 while 循环中的两个条件,会发生什么错误? 因为现在,防止运行时错误的是在最后一次迭代中,只有第一个条件检查以防止 ArrayIndexOutOfBoundsException
。如果 while 循环的最后一次迭代检查了这两个条件,则会发生运行时错误,因为程序试图访问数组边界之外的元素。