2015-11-07 91 views
0

我正在执行一项段树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)

+3

为什么'mid'实例变量?它看起来像调用树中的所有'build'调用共享相同的'mid'。 – user2357112

+0

@ user2357112这应该不是问题,因为函数参数保证在函数调用之前进行评估。对?那么,我对这个范式很陌生。所以,我不知道有一个局部变量的正确方法是什么。 – silentboy

+1

你打电话建立两次,对于第二次电话中间会被第一次电话 – shurik

回答

1

按照意见 - 建立在连续打了两次电话和第二个电话中期实例变量已经被改写第一个电话。

我起初并没有张贴此作为一个答案,因为,即使我做了一个中期局部变量我还是没能得到您的预计数字。但很高兴它帮助:)