c++ - 为什么这个递归调用以这种方式工作?

标签 c++ recursion g++4.8

我正在为 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;
}

现在,如果 vector 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 实例变量已经被第一次调用覆盖。

我最初没有将此作为答案发布,因为即使我将 mid 设为局部变量,我仍然无法获得您期望的数字。但很高兴它有所帮助:)

关于c++ - 为什么这个递归调用以这种方式工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33578925/

相关文章:

c++ - MacPorts gcc48 无法识别的命令行选项 '-stdlib=libc++'

c++ - 为什么字符串文字比较是 C++ 中实现定义的行为?

c++ - 我在哪里可以看到来自 Visual Studio 2012 中未处理的 std::exception 的 what() 消息?

c++ - test.exe : 0xC0000005: Access violation reading location 0xfffffffc 中 0x00418c38 处的未处理异常

python - 如何创建一个递归函数,生成多个 for 循环并计算总次数

javascript - JavaScript 中的洪水填充算法 - 太多递归

c++ - 在 python 中导入 C++ 类?

c# - 调用 SysFreeString() 时出现堆损坏错误

go - Maxsubsequence-此问题的主要见解是什么?

c++ - 空 vector 的大小