我正试图用c++编写一个递归函数,但它一直导致堆栈溢出
I am trying to write a recursive function in c++ and it keeps causing a stack overflow
所以我正试图编写一个递归函数来计算字符网格上的所有空格。这是为了一个项目,在这个项目中,我必须编写一个程序来计算围棋简化游戏的分数。给我的板子是这样的http://pastebin.com/7MaFtmmw[1] 。所有的空地都被包围了。我应该最终找到哪位玩家周围有更多的空地。我不知道如何找到有多少空间被一个特定的字符包围。我想我知道如何计算所有的空格。我写这个代码就是为了这样做http://pastebin.com/Pd2ds9fw[2] 。我从堆栈上声明的类的对象调用它,就像这样;game.countSpaces(0,0)。不管怎样,它总是会导致堆栈溢出。我试过调试它,但它从未到达最后两个函数调用。它只是循环前两个,直到visualstudio最终崩溃。有人能解释一下为什么这样找不到空格的数量吗?为什么它会导致堆栈溢出?你能不能给我一个提示,告诉我如何在这里之后只计算一名玩家包围的空间?如果没有,那也没关系。但我真的很想知道为什么我最初的空间计数功能不起作用。p.s.我没有宣布计数,因为它是班上的一员。
void GoScorer::countSpaces(int row, int col)
{
if((row < 0) || (row >= BOARDSIZE))
return;
if((col < 0) || (col >= BOARDSIZE))
return;
if (board[row][col] != ' ')
return;
count++;
countSpaces((row - 1), col);
countSpaces((row + 1), col);
countSpaces(row, (col - 1));
countSpaces(row, (col + 1));
return;
}
BWB BW WB BW
BWB BW WB BW
BWBBBBW WB BW
BWWWWWW WBBBWWWWW
BBW WW WWBBBBBBB
BWWWWW WB
BBBBBWWWWB
BBBBB BBWWWBB BBBB
WWWWB BW WBBBWWWW
WWB BWWWB BW
WBBBBBBBWBBBBW
WWWWWWWWWB BW
WW WWWWB BWWWW
WWWWW WB BBBBB
BBBBWWW WB
BBBBW WB BBBBB
BBBBWWW WB BWWWW
BBBW WB BW
BW WB BW
您的countSpaces
函数将永远不会返回。例如,如果从(2,2)开始,它将递归到(2,1),然后(最终)再次递归到(2,2)。
你需要进行某种检查,看看是否已经计算了空间。一种方法是让另一个网格在每个点都有一个标志,说明这个位置是否已经被计算在内。
通常,递归函数应该总是在某些条件下调用自己,而这些条件可能并且最终将是false。
在没有条件的情况下调用递归函数(内部)是没有意义的。(但是您可以在调用之前有条件地返回,使该调用成为有条件的)
这是其他1000个可能的解决方案之一:
void GoScorer::countSpaces(int row)
{
if((row < 0))
return;
count+=std::count(std::begin(board[row]), std::end(board[row]),' ');
countSpaces(row-1);
return;
}
称之为
countSpaces(BOARDSIZE-1)
EDIT:如果您需要纯递归方法:
int count=0;
void GoScorer::countSpaces(int row, int col)
{
if(col < 0){
if(row>0){
countSpaces((row - 1), BOARDSIZE-1);
return;
}
}
if(row < 0){
return;
}
if (board[row][col] == ' '){
++count;
}
countSpaces(row, col - 1);
return;
}
称之为
countSpaces(BOARDSIZE-1,BOARDSIZE-1);
p.S.未测试
如果不清楚,请随时询问
必须标记已计数的单元格,否则它将无限循环。
例如,它可以向左->向上->向右->向下,然后它将再次位于同一单元格中。
您可以添加bool相同大小的表格,并标记每个单元格:
void GoScorer::countSpaces(int row, int col)
{
if((row < 0) || (row >= BOARDSIZE))
return;
if((col < 0) || (col >= BOARDSIZE))
return;
if (visited[row][col])
return;
if (board[row][col] != ' ')
return;
visited[row][col] = true;
count++;
countSpaces((row - 1), col);
countSpaces((row + 1), col);
countSpaces(row, (col - 1));
countSpaces(row, (col + 1));
return;
}
- 为什么这个递归函数会创建一个无限循环?
- 使用递归计算一个函数中的高度和大小
- 在int main()[c++]中实现一个递归函数
- 如何编写一个递归函数,以随机的方式混淆从0到6的数字
- 如何创建一个递归函数来显示有多少元音具有输入
- 我们应该全局声明一个向量还是在递归函数中传递它以减少内存使用
- 编写一个函数,用递归函数检查数字是否是正方形
- 一个递归函数,用于计算 n-airy 树的高度
- 从一个值和一个大小创建递归函数参数列表
- 编译时间递归函数以计算两个整数的下一个功能
- 如何在不使用静态变量的情况下从递归函数中只调用另一个函数一次
- 在turbo c++中,可以将一个普通递归函数转换为尾递归函数来对其进行优化
- 编写一个递归函数来乘以2个整数
- Fencepost问题:我需要一个递归函数,当它第一次被调用时,它会跳过执行一个部分
- 这个递归函数(回文)变成了一个无限循环
- 在C++中做了一个递归函数。现在要求创建一个"tail-recursion"函数
- 我正试图用c++编写一个递归函数,但它一直导致堆栈溢出
- 我想要一个递归函数来检查使用二进制搜索数组的顺序
- Boost regex smatch在递归函数中的行为就像一个静态变量
- 传递一个向量作为递归函数的引用