尾递归函数未被 g++ 优化
Tail Recursive Function is not being optimised by g++
我有一个简单的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
索引,因为您始终检查矩阵第一行的长度。
相关文章:
- 空基优化子对象的地址
- 关闭||运算符优化
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 返回值优化:显式移动还是隐式
- 人脸跟踪arduino代码的优化
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 纯函数,为什么没有优化
- 为什么大多数 pair 实现默认不使用压缩(空基优化)?
- 如何以优化的方式同时迭代两个间距不相等的数组
- 小字符串优化(调试与发布模式)
- 浮点定向舍入和优化
- Visual Studio 调试优化如何工作?
- 为什么开关的优化方式与 c/c++ 中的链接不同?
- 线性优化目标函数中的绝对值
- GCC 会优化内联访问器吗?
- gcc 如何优化此循环?
- 如何防止 CUDA-GDB 中的<优化输出>值
- 为什么我的程序在 O0 和 O2 的优化级别返回不同的结果
- 这个C++编译器优化(在自身的实例上调用对象自己的构造函数)的名称是什么,它是如何工作的?
- 使用 std::p air 进行返回值优化