1

我正在开发一个 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

4 回答 4

3

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

于 2013-01-22T22:50:37.870 回答
1

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

假设:

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

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

这是我对使用递归执行此操作的伪代码的尝试(其中,boggle 板是一个 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 中的局部变量)并且应该以特定顺序访问时,堆栈非常有用,这在这里并没有真正的帮助。仅供参考,通过使用递归,无论如何你都在使用 Java 的调用堆栈,如果你不小心,你可以永远递归,你会得到一个 StackOverflowException ;)

于 2013-01-22T23:30:46.273 回答
1

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

于 2013-01-22T22:47:11.350 回答
0

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

于 2013-01-22T22:43:32.890 回答