我正试图用c++编写一个递归函数,但它一直导致堆栈溢出

I am trying to write a recursive function in c++ and it keeps causing a stack overflow

本文关键字:递归函数 一个 一直 栈溢出 堆栈 c++      更新时间:2023-10-16

所以我正试图编写一个递归函数来计算字符网格上的所有空格。这是为了一个项目,在这个项目中,我必须编写一个程序来计算围棋简化游戏的分数。给我的板子是这样的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;
}