【问题标题】:Tail Recursive Function is not being optimised by g++尾递归函数没有被 g++ 优化
【发布时间】:2020-05-15 21:14:37
【问题描述】:

我有这个用于岛数问题的简单 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;        
}

【问题讨论】:

  • 有趣的问题!你做了什么来找出问题所在?您是否尝试过使用调试器来单步执行代码?您是否插入了诊断输出语句以查看发生了什么?
  • 尾递归可能只消除这四个递归调用中的第四个。你还有三个,它们会比我喝一杯咖啡更快地吃光你的堆栈。
  • 我不知道它是随着 C++17 改变还是随着 C++20 改变,但尾调用优化到目前为止还不是 C++ 的必需部分,编译器不是必须这样做。
  • 这不是尾递归,因为您执行了多次递归调用。
  • 你的矩阵有多大?堆栈溢出是可能的,我没有看到任何其他错误。

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


【解决方案1】:

为了进行尾递归优化,最后一条语句应该是递归调用。看到这个example

// 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 的示例,请参阅上面的链接。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-20
    • 2021-05-30
    • 2018-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-14
    相关资源
    最近更新 更多