Java:记住递归方法中上一步的结果

时间:2013-01-22 22:40:10

标签: java arrays recursion boggle

我正在研究一个Boggle游戏,有些人告诉我搜索单词的最佳方法是使用递归。我正在尝试使用searchWord方法来搜索单词。如果找到第一个字母,则该方法调用自身并删除第一个字母。当长度== 0(找到单词)或false(未找到字母时),该方法返回true。问题有时是在一个“骰子”周围有多次相同的字母...为了解决这个问题,我需要计算那个字母,如果它不止一次,它应该搜索该字母的下一个外观(搜索同一个词没有丢掉第一个字母)。我需要一种方法来记住那个字母和多个字母所围绕的字母的索引,这样当找不到字母时可以使用它来检查是否还有其他可能性。因为它是一个递归方法,所以我不知道如何将它们放在变量中,因为只要方法调用它们就会改变它们......

希望你们能帮忙!这是方法:

public boolean searchWord(String word, int i, int j) {
    boolean res;
    if (word.length() == 0) {
        res = true;
    } else {
        String theWord = word.toUpperCase();
        int[] indexes = searchLetter(Character.toString(theWord.charAt(0)), i, j);
        if (indexes[0] > -1) {
            res = searchWord(theWord.substring(1), indexes[0], indexes[1]);
        } else if(countLetter(Character.toString(/*The value that has to be memorized*/), /*index 1 that has been memorized*/, /*index 2 that has been memorized*/) > 1) {
            res = searchWord(theWord, i, j);
        } else {
            res = false;
        }
    }
    return res;
}

注意:是的,我使用的字符串很奇怪,因为字符可能是更好的选择,但我可以稍后更改。

4 个答案:

答案 0 :(得分:3)

原则上,您可以传递任何此类值作为附加参数。这样,参数/调用堆栈就像你的堆栈一样。

答案 1 :(得分:1)

只需在方法中添加其他参数即可。例如,您可以创建一个简单地保存字母和int的对象。由于Java在进行递归调用时仅传递对此对象的引用(但不复制对象本身),因此该参数将始终指向同一对象。您可能想要使用Java的对类(如果我没记错的话,它会在地图中使用)。

答案 2 :(得分:1)

目标:查看Boggle板上是否存在单词

假设:

  • 每个位置(即立方体)每个单词只能使用一次

  • 每个字母必须相邻 (垂直,水平或对角)

这是我尝试使用伪代码进行递归(其中boggle board是一个2D字符数组 - 在调用此方法之前应该已经填充了字符):

// searches for a single occurence of a word on the boggle board
boolean searchWord(String word, char[][] board)
    for each position on the board (x,y)
        boolean[][] visited = new boolean[width][height] // all false
        if (searchWord(x,y,board,visited))
            return true
    return false

// searches a position on the board
boolean searchWord(String word, int x, int y, char[][] board, boolean[][] visited)
    if x and y are valid (0 >= x < width and 0 >= y < height)
        if visited[x][y] == false
            visited[x][y] = true
            if the letter at x,y equals the 1st char of the search word
                if word.length() == 1
                    return true
                else
                    for each surrounding position (x2, y2)
                        if searchWord(word.substring(1),x2,y2,board,visited)
                            return true
    return false

正如您所看到的,递归是路径寻找(寻找切换词)的不错选择。您只需要传递当前状态(在这种情况下为visited数组),这样您就知道您已经去过的地方。

我已经使用参数来存储状态,但如果你真的想要,可以使用实例变量。我建议使用参数,因为它与函数式编程范例一致,并且不太可能遭受意外的副作用。

这里没有必要明确使用堆栈。当值scope(如Java中的局部变量)并且应该按特定顺序访问时,堆栈很棒,这在这里没有任何帮助。 FYI通过使用递归你无论如何都在使用Java的调用堆栈,如果你不小心你可以永远递归,你将得到一个StackOverflowException;)

答案 3 :(得分:0)

你应该重写它以使用Stack。使用Stack几乎总是可以更好地完成递归。然后,您可以存储有关上下文的一些信息,只需将内容推送到需要更多处理的堆栈上,并在准备好处理它们时将其弹出。