尾递归函数未被 g++ 优化

Tail Recursive Function is not being optimised by g++

本文关键字:g++ 优化 递归函数      更新时间:2023-10-16

我有一个简单的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;        
}

要进行尾部递归优化,最后一条语句应该是递归调用。请参阅此示例:

// 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<binaryMatrix[0].size(); j++)将允许您访问无效的j索引,因为您始终检查矩阵第一行的长度。