[英]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.