这是使用python的词典程序。但是我发现这样的错误。我想知道我看到的原因。 如果您知道这一点,请问我。
这是我遇到的错误:
$ read datafile.txt
$ size
176050
$ find Yesterday
Traceback (most recent call last):
File "C:/Users/LG/PycharmProjects/alg1/lesson1.py", line 55, in <module>
word_index = binarysearch(words,word,0,len(words)-1)
File "C:/Users/LG/PycharmProjects/alg1/lesson1.py", line 25, in binarysearch
return binarysearch(data, target,middle+1, end)
File "C:/Users/LG/PycharmProjects/alg1/lesson1.py", line 23, in binarysearch
return binarysearch(data,target,begin,middle-1)
File "C:/Users/LG/PycharmProjects/alg1/lesson1.py", line 23, in binarysearch
return binarysearch(data,target,begin,middle-1)
File "C:/Users/LG/PycharmProjects/alg1/lesson1.py", line 23, in binarysearch
return binarysearch(data,target,begin,middle-1)
[Previous line repeated 994 more times]
File "C:/Users/LG/PycharmProjects/alg1/lesson1.py", line 13, in binarysearch
if begin > end:
RecursionError: maximum recursion depth exceeded in comparison
Process finished with exit code 1
这是我的代码:
def datafile(file):
f = open(file,'rt',encoding='UTF8')
while True:
line = f.readline()
if not line:
break
if line == '\n':
continue
lines.append(line.split('\n')[0])
return lines
def binarysearch(data,target,begin,end):
if begin > end:
if data[end]: #"end" index's front data exist
return end
else:
return -1
else:
middle = int(begin+end/2)
if data[middle] == target:
return middle
elif data[middle] > target:
return binarysearch(data,target,begin,middle-1)
else:
return binarysearch(data, target,middle+1, end)
if __name__=="__main__":
lines = [] # all list
words = [] # list that all words is changed to lower
pos = [] # word's pos list
while True:
commend = input("$ ")
if len(commend.split()) == 2:
second = commend.split()[1]
first = commend.split()[0]
if first == "size":
print(len(lines))
if first == "read":
lines = datafile(second)
for i in lines:
words.append(i.split()[0].lower())
pos.append(i.split()[1])
if first == "find":
# receive index, and print word that fitted to condition
word = second.lower()
word_index = binarysearch(words,word,0,len(words)-1)
if words[word_index] in words: # if return value is middle variable
print(lines[word_index])
cnt = 1
while words[word_index] == words[word_index+1]:
print(lines[word_index])
cnt = cnt + 1
print("Found",cnt,"items.")
else: #if return value is the same with "end" variable
print("Not found")
print(lines[word_index].split()[0],lines[word_index].split()[1])
print("- - -")
print(lines[word_index+1].split()[0], lines[word_index+1].split()[1])
#print(lines[word_index])
#print(words[word_index])
if first == "exit":
break
答案 0 :(得分:1)
您的二进制搜索算法出错:
middle = int(begin+end/2)
由于除法优先于加法,因此不会计算中间位置。它可能导致middle
变得大于end
,如果data[middle] > target
,则下一个间隔将在下一个递归调用中更大。这可能导致无限递归。
更正为:
middle = int((begin+end)/2)
或者简单地:
middle = (begin+end)//2