我有一个简单的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;
}
这是关于尾递归的部分答案。为了进行尾递归优化,最后一条语句应该是递归调用。看到这个post:
// 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,请参见上面的链接。