我想知道是否有人可以指出我在这方面的正确方向,我觉得我忽略了一些非常简单的事情,主要是在一个约45,000字的列表上调用搜索方法,我相信这是问题,我的代码适用于列表中前6个或数千个单词的单词,但之后会遇到StackOverflow错误并崩溃。我有一个非递归的版本,工作正常。
我有两个基本情况,它们是数组的结尾,在这种情况下我们抛出ItemNotFoundException,如果找到了单词,在这种情况下我们返回项目所在的索引。
我目前的代码是:
public int search(String[] words, String wordToFind)
throws ItemNotFoundException {
return search(words, wordToFind, 0);
}
private int search(String[] words, String wordToFind, int index) {
incrementCount();
if(index == words.length) {
// If index gets to the end of the array, then the word is not in the array
throw new ItemNotFoundException();
}
if (words[index].equals(wordToFind)) {
// If word is found, return the index.
return index;
} else {
// Increment index by 1
index++;
// Call the search again
return search(words, wordToFind, index);
}
}
非递归代码,运行正常:
public int search(String[] words, String wordToFind)
throws ItemNotFoundException {
int count = 0;
for (String word : words) {
incrementCount();
if (word.equals(wordToFind)) {
return count;
}
count++;
}
throw new ItemNotFoundException();
}
答案 0 :(得分:3)
主要是在大约45,000个单词的列表上调用搜索方法,我认为这是问题
是的,单词列表的长度很大 导致堆栈溢出 对于这么多单词来说这是正常的。
答案 1 :(得分:0)
您反复遇到堆栈溢出的原因是您要递归O(n)次,其中n是列表的大小。这意味着对于列表中的每个元素,您都要为程序堆栈分配一个必须保留的函数调用,直到找到结果为止。这自然会限制您可以搜索的列表的大小。
对于较大的列表,您需要更高效的递归解决方案,例如binary search。