簡體   English   中英

尾遞歸 Function 未被 g++ 優化

[英]Tail Recursive Function is not being optimised by g++

我有這個用於島數問題的簡單 DFS 代碼,但是當我使用 G++ -O2 時,即使是尾遞歸 function,我仍然遇到分段錯誤。

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;        
}

為了進行尾遞歸優化,最后一條語句應該是遞歸調用。 看這個例子

// 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 的示例,請參見上面的鏈接。

由於缺少主function,不知道二進制矩陣是否初始化正確且所有行向量的長度相同。 如果行向量的長度不同,則for(int j =0; j<binaryMatrix[0].size(); j++)將允許您訪問無效的j索引,因為您總是檢查矩陣的第一行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM