2012-02-12 76 views
0

這裏有一個簡單的程序,我寫了查找所有非遞減數字的長度爲< = L其數字總和爲N.代碼工作正常,但當我嘗試時鐘使用ctime中的clock()的運行時間顯示出奇怪的行爲。C++時鐘()表現奇怪與遞歸函數

#include<iostream> 
#include<vector> 
#include<ctime> 
using namespace std; 
typedef long long int LL; 
    int Sum(LL S){ 
     int sum=0; 
     for(;S;S/=10) 
       sum+=S%10; 
     return sum; 
} 
void Generate(LL S, int len, int N, int L, vector<LL> &V){ 
     if(len<L) 
       for(int i=0;i<=9;++i) 
         if(i>=S%10) 
           Generate(S*10+i, len+1, N, L, V); 
     int sum = Sum(S); 
     if(sum!=N) 
       return; 
     else if(sum == N && len == L){ 
       V.push_back(S); 
       cout << S << endl; //Line 4 
       return; 
     } 
} 
int main(){ 
     int N,L; 
     vector<LL> V; 
     LL S; 
     cin >> N >> L; 
     clock_t start=clock(); //Line 1 
     Generate(S, 0, N, L, V); 
     //clock_t start=clock(); //Line 2 
     clock_t end = clock(); 
     for(int i=0;i<V.size();++i) 
       cout << V[i] << " "; 
     cout << endl; 
     cout << "Run time: " << (double)(end-start)/CLOCKS_PER_SEC; 
     return 0; 
} 

我記錄了no。的時鐘滴答在調用// Line 1的「Generate」函數之前已經過去了,我在// Line 2之後做了同樣的事情,我相信這種差異會給我帶來不一樣的結果。在生成所需數字時已過時鐘滴答。

但是,如果我這樣做,我的功能「生成」的處理會受到某種程度的影響!它不會將數字輸出到標準輸出(來自//第4行),即使我傳遞一個向量來存儲生成的數字,它也不會存儲任何!但是,如果我在// Line 2使用clock(),我在標準輸出上的輸出很好,並且引用的向量V被填滿了所需的結果。但//第2行上的clock()是沒用的。

我不明白的是如何調用clock()影響'Generate'函數中的某些處理,除非我有一些晦澀的Bug!或者clock()不應該用於這種遞歸設置?

請幫我調試這個。

回答

5

我得到的變量S正在被使用而沒有在你的代碼中被初始化。真的,你需要在開始時將它初始化爲0。從那時起,這種行爲變得不可預測 - 因此您可能會不時得到正確答案,但我對此表示懷疑。它不取決於clock()的呼叫。

+0

哎呀!是的,你說得對。謝謝。 – srbhkmr 2012-02-12 09:21:10