2016-12-10 2 views
-1

Привет, ребята, поэтому у меня есть этот код, который мне нужен для проекта в университете. Код, который у меня есть, рекурсивный, и у меня много времени на загрузку. Я попытался преобразовать его в итеративный, но я могу Кажется, это не так, потому что результат отличается. Не могли бы вы помочь мне его преобразовать? Спасибо.Рекурсивный код на C++ для итеративного

void getBrewCount(int n, int i, int j){ 
if(i ==n && j == n){ //reach the (n,n) point 
    count++; 
}else if(i > n || j > n){//wrong way 
    return; 
}else { 
    if(i==8 && j==5){ 
     j++; 
    } 
    if(i==11 && j==5){ 
     j+=2; 
    } 
    if(i==15 && j>=14){ 
     i+=2; 
    } 
    if(i==21 && j>=22){ 
     i++; 
    } 
    getBrewCount(n, i +1, j); 
    getBrewCount(n, i , j +1); 
} 
+1

Вы можете использовать 'std :: stack' и небольшую структуру, содержащую 3 значения параметров. –

+0

@Alexandru Madalin Для начала вы могли бы сказать, что делает функция? –

+0

Когда вы говорите, требуется много времени, какой номер вы используете при вызове функции и что будет результатом в этом случае? Идея была бы полезной, как если бы n находилось между 0 и 25, мы могли бы не дать такой же ответ, как если бы это было от 1 до 10 миллионов, например. – Phil1970

ответ

2

В рекурсии у вас есть условие окончания. Когда это условие выполняется, рекурсия заканчивается, и вы «пузыряетесь» от рекурсии. Если вы хотите сделать то же самое итеративно, конечное условие рекурсии должно быть условием вашего цикла. Ваша рекурсия заканчивается после того, как она выходит за пределы диапазона. Вы можете написать цикл while(), который будет зацикливаться до тех пор, пока он не достигнет диапазона, поэтому while (i < n & & j < n) {}. Мой цикл while увеличивает счетчик и ломается сам, когда диапазон достигнут. Однако я не знаю, какова реальная функциональность вашей функции, поэтому вы можете немного ее изменить.

void getBrewCount(int n, int i, int j) { 
    while (i < n && j < n) { 
     // my ending condition 
     if (i == n && j == n) { 
     ++count; 
     break; 
     } 

     /* code that updates i, j e.g. 
     if (i == 10) 
     ++j; 
     */ 
    } 
    return; 
} 
+0

Большое спасибо !! Это сработало. Я тоже что-то пробовал, но забыл про перерыв. –

+1

Первый оператор 'if' никогда не будет запущен. –

+0

Это был просто пример того, как это можно было бы обработать, так как он сам должен найти условие, когда {} закончится. –