为什么这个递归调用以这种方式工作?
Why this recursive call works this way?
我正在为 RSQ 实现线段树。我观察到一些没有意义的东西。这是原始代码的复制版本:
#include <iostream>
#include <vector>
using namespace std;
class ST {
private:
int siz, mid;
void build(int n, int l, int r)
{
cout << n << " " << l << " " << r << endl;
if(l == r){
//some op
} else {
mid = (l+r)/2;
build(2*n, l, mid);
build(2*n+1, mid+1, r);
//some op
}
}
public:
ST(vector<int> &x)
{
siz = x.size();
build(1, 0, siz-1);
}
};
int main()
{
vector<int> p;
int t, z;
cin >> t;
while(t--)
{
cin >> z;
p.push_back(z);
}
ST c(p);
return 0;
}
现在,如果向量 p 的大小为 3,则第一次构建会按预期使用 (1, 0, 2) 调用。但它应该递归地得到 build(2, 0, 1)
和 build(3, 2, 2)
。第一个工作正常,而第二个称为 build(3, 1, 2)
。似乎 mid+1
正在生成 mid
。我错过了什么?
g++ -v
显示 gcc 版本 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04)
根据评论 - build 被连续调用两次,第二次调用 mid 实例变量已经被第一次调用覆盖。
我最初并没有post这个作为答案,因为即使我将 mid 设为局部变量,我仍然无法获得您期望的数字。但很高兴它有所帮助:)
我正在为 RSQ 实现线段树。我观察到一些没有意义的东西。这是原始代码的复制版本:
#include <iostream>
#include <vector>
using namespace std;
class ST {
private:
int siz, mid;
void build(int n, int l, int r)
{
cout << n << " " << l << " " << r << endl;
if(l == r){
//some op
} else {
mid = (l+r)/2;
build(2*n, l, mid);
build(2*n+1, mid+1, r);
//some op
}
}
public:
ST(vector<int> &x)
{
siz = x.size();
build(1, 0, siz-1);
}
};
int main()
{
vector<int> p;
int t, z;
cin >> t;
while(t--)
{
cin >> z;
p.push_back(z);
}
ST c(p);
return 0;
}
现在,如果向量 p 的大小为 3,则第一次构建会按预期使用 (1, 0, 2) 调用。但它应该递归地得到 build(2, 0, 1)
和 build(3, 2, 2)
。第一个工作正常,而第二个称为 build(3, 1, 2)
。似乎 mid+1
正在生成 mid
。我错过了什么?
g++ -v
显示 gcc 版本 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04)
根据评论 - build 被连续调用两次,第二次调用 mid 实例变量已经被第一次调用覆盖。
我最初并没有post这个作为答案,因为即使我将 mid 设为局部变量,我仍然无法获得您期望的数字。但很高兴它有所帮助:)