G ++未优化尾递归函数

时间:2020-05-15 04:07:39

标签: c++ optimization g++ tail-recursion

对于“岛屿数目”问题,我有一个简单的DFS代码,但即使使用G ++ -O2时,它虽然是尾部递归函数,但仍然会出现分段错误。

void findneighbors(int i, int j,  int row, int column, vector<vector<char>>& binaryMatrix){
      binaryMatrix[i][j]='0';
      if((i+1)<row && binaryMatrix[i+1][j] == '1'){

        findneighbors(i+1,j, row,column, binaryMatrix);
      }

      if((i-1)>=0 && binaryMatrix[i-1][j] == '1'){
        findneighbors(i-1,j, row,column, binaryMatrix);
      }

      if((j+1)<column && binaryMatrix[i][j+1] == '1'){
        findneighbors(i,j+1, row,column, binaryMatrix);
      }

      if((j-1)>=0 && binaryMatrix[i][j-1] == '1'){
        findneighbors(i,j-1, row,column, binaryMatrix);
      }
}

int numIslands(vector<vector<char>>& binaryMatrix) {
      int count = 0;
      for(int i = 0; i<binaryMatrix.size(); i++){
        for(int j =0; j<binaryMatrix[0].size(); j++){
          if(binaryMatrix[i][j]=='1'){
            findneighbors(i,j,binaryMatrix.size(),binaryMatrix[0].size(),binaryMatrix);
            count++;
          }
        }
      }
    return count;        
}

1 个答案:

答案 0 :(得分:0)

要进行尾部递归优化,最后一条语句应该是递归调用。参见此linked documentation

// An example of tail recursive function 
void print(int n) 
{ 
    if (n < 0)  return; 
    cout << " " << n; 

    // The last executed statement is recursive call 
    print(n-1); 
} 

示例来自geeksforgeeks,请参见上面的链接。

由于缺少主函数,因此我不知道二进制矩阵是否正确初始化,并且所有行向量的长度都相同。如果行向量的长度不同,则for(int j =0; j<binaryMatrix[0].size(); j++)将允许您访问无效的j索引,因为您总是检查矩阵第一行的长度。

相关问题