2015-11-07 150 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

按照意見 - 建立在連續打了兩次電話和第二個電話中期實例變量已經被改寫第一個電話。

我起初並沒有張貼此作爲一個答案,因爲,即使我做了一箇中期局部變量我還是沒能得到您的預計數字。但很高興它幫助:)

相關問題