C++ C++;递归故障。你能帮我看看我想要什么吗;我做错了?

C++ C++;递归故障。你能帮我看看我想要什么吗;我做错了?,c++,gcc,recursion,segmentation-fault,boggle,C++,Gcc,Recursion,Segmentation Fault,Boggle,这是我第一次使用递归来做一些事情,而不是求一个数的阶乘。我正在建立一个程序,在一个拼字板中查找单词。以下是导致SEG故障的功能: void findWord(vector<string>& board, set<string>& dictionary, string prefix, int row, int column){ prefix += getTile(board, row, column); if(prefix.len

这是我第一次使用递归来做一些事情,而不是求一个数的阶乘。我正在建立一个程序,在一个拼字板中查找单词。以下是导致SEG故障的功能:

void findWord(vector<string>& board, set<string>& dictionary,
          string prefix, int row, int column){
  prefix += getTile(board, row, column);
  if(prefix.length() > biggestWordLength)
    return;
  if(isOutOfBounds(row, column))
    return;
  if(isWord(prefix, dictionary) == 1)
    foundWords.insert(prefix);
  if(isWord(prefix, dictionary) == 0)
    return;
  //Note: this does not prevent using the same tile twice in a word
  findWord(board, dictionary, prefix, row-1, column-1);
  findWord(board, dictionary, prefix, row-1, column);
  findWord(board, dictionary, prefix, row-1, column+1);
  findWord(board, dictionary, prefix, row, column-1);
  findWord(board, dictionary, prefix, row, column+1);
  findWord(board, dictionary, prefix, row+1, column-1);
  findWord(board, dictionary, prefix, row+1, column);
  findWord(board, dictionary, prefix, row+1, column+1);
}
void findWord(向量与棋盘、集合与字典、,
字符串前缀,int行,int列){
前缀+=getTile(板、行、列);
if(prefix.length()>biggestWordLength)
返回;
if(等自动边界(行、列))
返回;
if(isWord(前缀,字典)==1)
输入(前缀);
if(isWord(前缀,字典)==0)
返回;
//注意:这并不妨碍在一个单词中使用同一个磁贴两次
findWord(电路板、字典、前缀、第1行、第1列);
findWord(board、dictionary、前缀、第1行、第1列);
findWord(board、dictionary、前缀、第1行、第+1列);
findWord(board、dictionary、prefix、row、column-1);
findWord(board、dictionary、prefix、row、column+1);
findWord(board、dictionary、前缀、行+1、列-1);
findWord(板、字典、前缀、行+1、列);
findWord(board、dictionary、前缀、行+1、列+1);
}

在所有情况下,您都在向各个方向递归。考虑这个减少的递归版本:

void findword(... int x, int y, ...) {
   ...
   findword(... x, y+1, ...);
   findword(... x, y-1, ...);
   ...
}

现在考虑调用<代码> x==5 < /COD>和<代码> y==5 < /COD>(例如,任何其他位置也一样好)。我使用下面的缩进表示嵌套调用:

findword(... 5, 5, ...)
   findword(..., 5, 6, ...)    // x, y+1
      ...
   findword(..., 5, 5, ...)    // x, y-1
      // ouch! this is just the same as before, so it will eventually:
      findword(..., 5, 6, ...)
      findword(..., 5, 5, ...)
          // ouch!... here again! shall I continue?

现在,考虑一下算法。查找单词时,首先选择第一个字符,然后选择一个方向,然后沿该方向测试一个单词可以包含多少个字母。您实现的算法不仅尝试在行中查找单词,还尝试在任意形状中查找单词。

您应该在
前缀
末尾添加字符的部分之前进行边界检查!谢谢你的帮助!现在我有一个新问题。我传递论点的方式导致了一个错误。我正在更新我的问题,你能再帮我一次吗?你不应该用新内容更新问题。您应该创建一个单独的新问题。您更新问题以提供有关原始问题的更多信息,请澄清。。。。你不会改变。因为我们正在做这件事,所以在没有看到问题定义的情况下,回答更新是不可能的。请回滚该问题,询问另一个问题,并提供所有必需的信息