2012-02-12 10 views
0

ここでは、長さが0以外のすべての桁数を見つけるために書いたシンプルなプログラムです。コードはうまく動作しますが、 ctimeからのclock()を使った実行時間は、奇妙な動作を示します。C++ clock()は再帰関数で奇妙な振る舞いをします

#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; 
} 

私は記録しません。 // Line 1で "Generate"関数を呼び出す前に経過したクロックティックの数と、// Line 2で同じことをします。必要な数字を生成するのに経過したクロック・ティック数。

しかし、もし私が "Generate"の処理がどうにかして影響を受けるのです!それはstdoutに出力しません(// Line 4から)。生成された数値を格納するためにベクトルを渡しても、格納されません!

しかし、私が// Line 2でclock()を使用した場合、stdoutの出力は正常であり、参照されたベクトルVは目的の結果でいっぱいになります。 // line 2のclock()は役に立たない。

私が理解していないのは、clock()の呼び出しが、Generate関数の処理にどのように影響するのでしょうか?この種の再帰的なセットアップではclock()は使用されませんか?

私を助けてくださいこれをデバッグしてください。

答えて

5

変数Sがコード内で初期化されずに使用されています。あなたは最初に0に初期化する必要があります。それ以来、行動はかなり予測不可能です。したがって、時折正しい答えを得るかもしれませんが、私はそれを疑っています。それはclock()の呼び出しに依存しません。

+0

oops!はい、あなたはその権利を得ました。ありがとうございました。 – srbhkmr