2012-02-12 81 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