【发布时间】: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