这是一个常见的逻辑错误,是我在新程序员使用多种语言编写的许多问题中遇到的逻辑错误的答案。

问题是在数组中搜索与某些输入条件匹配的元素。用伪代码编写的算法看起来像这样:

for each element of Array:
    if element matches criteria:
        do something with element
        maybe break out of loop (if only interested in first match)
    else:
        print "Not found"


即使成功找到匹配的元素,该代码也会报告“未找到”。

评论

超越else语句,因此它适用于for循环,而不是if语句

@ F1Rumors只有Python才具有该功能,我将在答案中显示它。

#1 楼

问题是,当您通过数组线性搜索某些内容时,您直到到达数组末尾才知道找不到该内容。问题中的代码将为每个不匹配的元素报告“未找到”,即使可能还有其他匹配的元素也是如此。

简单的修改是使用一个变量来跟踪您是否发现了某些东西,并且然后在循环结束时检查此变量。

found = false
for each element of Array:
    if element matches criteria:
        do something with element
        found = true
        maybe break out of loop (if only interested in first match)

if not found:
    print "Not found"


Python在else:循环中有一个for块。仅当循环运行完成时才执行代码,而不是由于使用break而结束。这样可以避免使用found变量(尽管它可能对以后的处理还是有用的):

for element in someIterable:
    if matchesCriteria(element):
        print("Found")
        break
else:
    print("Not found")


某些语言具有内置机制,可以代替编写自己的循环。


某些语言具有anysome函数,该函数带有回调函数,并返回一个布尔值,指示该数组是否对数组的任何元素都成功。数组过滤功能,可以使用检查条件的功能过滤输入数组,然后检查结果是否为空数组。
如果您想精确匹配某个元素,则大多数语言都提供findindex函数,它们将搜索匹配的元素。

如果要经常搜索,最好将数组转换为可以更有效地搜索的数据结构。大多数语言都提供set和/或hash table数据结构(后者取决于语言使用许多名称,例如,关联数组,地图,字典),并且通常可以在O(1)时间内搜索,而扫描数组的时间为O( n)。