C ++ clock () ведет себя странно с рекурсивной функцией - PullRequest
0 голосов
/ 12 февраля 2012

Вот простая программа, которую я написал, чтобы найти все числа с неубывающими цифрами длины <= L, чьи цифры суммируют до N. Код работает нормально, но когда я пытаюсь синхронизировать время выполнения с помощью clock () из ctimeэто показывает странное поведение. </p>

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

Я записываю нет.тактов, прошедших до вызова функции «Генерировать» в // строке 1, и я делаю то же самое после // строки 2, разница в которой, как я считаю, должна дать мне «нет».тиковых часов в генерации нужных чисел.

Но если я сделаю это, то на мою функцию "Generate" как-то повлияет!Он не будет выводить числа в стандартный вывод (из // строки 4), и даже если я передам вектор для хранения сгенерированных чисел, он не сохранит никаких!

Однако, если я использую часы () в // строке 2 мой вывод на стандартный вывод в порядке, и указанный вектор V заполняется желаемым результатом.но clock () на // строке 2 бесполезен.

Что я не могу понять, так это как вызов clock () может повлиять на некоторую обработку в функции 'Generate', если, конечно, у меня нет неясной ошибки!или часы () не должны использоваться в такой рекурсивной установке?

Пожалуйста, помогите мне отладить это.

1 Ответ

5 голосов
/ 12 февраля 2012

Я понимаю, что переменная S используется без инициализации в вашем коде.На самом деле вам нужно инициализировать его до 0 в самом начале.С тех пор поведение становится совершенно непредсказуемым, поэтому время от времени вы можете получать правильные ответы, но я сомневаюсь в этом.Это не зависит от звонков clock().

...