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)
爲什麼'mid'實例變量?它看起來像調用樹中的所有'build'調用共享相同的'mid'。 – user2357112
@ user2357112這應該不是問題,因爲函數參數保證在函數調用之前進行評估。對?那麼,我對這個範式很陌生。所以,我不知道有一個局部變量的正確方法是什麼。 – silentboy
你打電話建立兩次,對於第二次電話中間會被第一次電話 – shurik