为什么这个递归调用是这样工作的

Why this recursive call works this way?

本文关键字:工作 调用 递归 为什么      更新时间:2023-10-16

我为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)。第一个正确工作,而第二个被称为CCD_。似乎mid+1正在产生mid。我错过了什么?

g++ -v显示gcc版本4.8.4(Ubuntu 4.8.4-2ubuntu114.04)

根据注释,build被连续调用两次,对于第二次调用,中间实例变量已经被第一次调用覆盖。

我最初并没有把这个作为答案发布,因为即使我把mid作为局部变量,我仍然无法得到你期望的数字。但很高兴它有所帮助:)

相关文章: