java如何避免在递归中重复

时间:2011-09-30 14:07:35

标签: java recursion

我试图以递归方式搜索同义词(我将其声明为'synset')。不幸的是,有同义词的重复。例如:当我搜索单词student时,输出将如下:

Search word: student

Synset 0: pupil
  Synset 0: student
    Synset 0: pupil
    .
    .
    .
  Synset 1: educatee
  Synset 2: schoolchild
Synset 1: educatee
Synset 2: scholar
Synset 3: bookman

我想将所有输出存储到数据库中,我不需要重复输出。这是我的代码的一部分,包括递归函数。希望有人能帮助我。谢谢

public String printSynset(String word)
    {
        //call wordnet library
RiWordnet wordnet = new RiWordnet(); //call stemmer method PorterStemmer s = new PorterStemmer();

Vector<String> synsetVec = new Vector<String>(); String[] synset = wordnet.getAllSynsets(word, "n"); for (int k=0; k<synset.length; k++) { synsetVec.add(synset[k]); if (!synsetVec.isEmpty()) { for (int j = 0; j < synsetVec.size();) { GUIsynonymTA.append("\n"); GUIsynonymTA.append(" No." + j + ": " + (s.Stem(synsetVec.get(j)))); GUIsynonymTA.append("\n"); return printSynset(synsetVec.get(j)); } } else if (synsetVec.isEmpty()) return word; } return word; }//end printSynset()

2 个答案:

答案 0 :(得分:7)

您应该保留Set已经看过的项目。每当你点击一个项目时,首先要检查它是否曾被看过;如果是,停止递归;如果不是,请将其添加到集合中并继续。

结果是对一般图形的经典深度优先搜索,您可以在任何算法教科书或Russell & Norvig第3章中找到它。伪代码:

Set<Node> printSynset(Node root) {
    HashSet<Node> closed;
    printDFS(root, closed);
}

// recursive graph dfs
void printDFS(Node n, Set<Node> closed) {
    if (!closed.contains(n)) {
        print(n.item);
        closed.add(n);
        for (Node s : n.neighbors())
            printDFS(n, closed);
    }
}

请注意,当printDFS返回printSynset时,它会填充closed所有已访问过的节点,因此您也可以选择返回Set<Node>并循环在printSynset上覆盖它,而不是在printDFS中进行打印。这将为您提供一个通用的,可重复使用的DFS例程。

答案 1 :(得分:4)

使用Set存储以前找到的匹配项。如果单词在Set中,则不再输出它。

Set

将Set维护为类级别字段,以便方法的所有递归都可以访问Set。如果Set.add(word)返回false,则您知道该字词已在Set中。