這是一個(gè)邏輯錯(cuò)誤的通用問題和答案,我在新程式設(shè)計(jì)師用各種語言提出的許多問題中都看到過。
問題是在陣列中搜尋與某些輸入條件相符的元素。演算法的偽代碼如下所示:
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"
即使成功找到匹配元素,此程式碼也會(huì)報(bào)告「未找到」。
問題是,當(dāng)您透過數(shù)組線性搜尋某些內(nèi)容時(shí),直到到達(dá)數(shù)組末尾時(shí)您才知道沒有找到它。問題中的程式碼針對每個(gè)不匹配的元素報(bào)告“未找到”,即使可能存在其他匹配元素。
簡單的修改是使用一個(gè)變數(shù)來追蹤您是否發(fā)現(xiàn)了某些內(nèi)容,然後在循環(huán)結(jié)束時(shí)檢查該變數(shù)。
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 在其 for
迴圈中有一個(gè) else:
區(qū)塊。僅當(dāng)循環(huán)運(yùn)行完成時(shí)才執(zhí)行程式碼,而不是因?yàn)槭褂?break
而結(jié)束。這使您可以避免 found
變數(shù)(儘管它可能對以後的處理仍然有用):
for element in someIterable: if matchesCriteria(element): print("Found") break else: print("Not found")
某些語言具有內(nèi)建機(jī)制,可以使用這些機(jī)制來取代編寫自己的循環(huán)。
any
或 some
函數(shù),它們接受回呼函數(shù),並傳回一個(gè)布林值,指示函數(shù)對於陣列的任何元素是否成功。 find
或 index
函數(shù)來搜尋匹配元素。 如果您要頻繁搜索,最好將數(shù)組轉(zhuǎn)換為可以更有效搜索的資料結(jié)構(gòu)。大多數(shù)語言提供集合
和/或哈希表
資料結(jié)構(gòu)(後者根據(jù)語言有許多名稱,例如關(guān)聯(lián)數(shù)組、映射、字典),這些通常是搜尋的時(shí)間為O(1),而掃描數(shù)組的時(shí)間為O(n)。