У меня есть рекурсивная функция,которая вызывает саму себя 5 раз int rec( int **array). Как сделать так,что бы передаваемый массив не менялся в предыдущем вызове рекурсии.
Вот код.Ф-я rec вызывыет саму себя раза 3-4.нужно 4то бы в этих 3-4 вызовах массив field Не менялся. Т.е если изменили в 1ом вызове,то во втором вызове он уже оставался таким каким был .
int rec(int ** field, int ** key, int ** primaty_field) {
cout << "RE1C #" << r++ << endl;
int size = 5;
if (r > 0) {
print(primaty_field, size);
print(field, size);
}
int count;
int value = 0;
int fuul = 0;
int grow[2] = {
1,
1
}; //Массив отве4ающий за рост каждого клю4а
//Условие выхода из рекурсии
for (int ii = 0; ii < size; ii++)
for (int jj = 0; jj < size; jj++) {
if (primaty_field[ii][jj] != '*')
fuul++;
}
if (r == 10) //если весь field заполнен
{
print(field, size);
return 0; ///ВЫХОД ИЗ РЕКУРСИИ
}
while (growth_sequence(grow) == true) {
//cout << "Grow : " << grow[0] << " " << grow[1] << endl;
count = -1;
value = 0;
for (int i = 0; i < size; i++) //////////
{ ////////// Ищем нужный клю4 на поле
for (int j = 0; j < size; j++) ///////
{
if (key[i][j] != '*') //Если нашли Клю4
{
count++;
if (grow[count] == 1) //Вверх
{
if (Check_top_empty(primaty_field, i, j, key[i][j], size) == true) {
top(primaty_field, i, j, key[i][j], size);
value++;
} else {
recovery_field(field, primaty_field, size);
} //рекурсия,т.к нам не подходит текущаяя комбинация grow
}
if (grow[count] == 2) //Вниз
{
if (Check_bottom_empty(primaty_field, i, j, key[i][j], size) == true) {
bottom(primaty_field, i, j, key[i][j], size);
value++;
} else {
recovery_field(field, primaty_field, size);
}
}
if (grow[count] == 3) //Вправо
{
if (Check_right_empty(primaty_field, i, j, key[i][j], size) == true) {
right(primaty_field, i, j, key[i][j], size);
value++;
} else {
recovery_field(field, primaty_field, size);
}
}
if (grow[count] == 4) //Влево
{
if (Check_left_empty(primaty_field, i, j, key[i][j], size) == true) {
left(primaty_field, i, j, key[i][j], size);
value++;
} else {
recovery_field(field, primaty_field, size);
}
}
}
}
}
if (value == 2) //Возможная комбинация
{
if (r == 10) {
cout << grow[0] << " " << grow[1] << endl;
}
int n = -1;
cout << grow[0] << " " << grow[1] << endl;
rec(primaty_field, key, primaty_field); ///Рекурсия
/// print(primaty_field, size);////На этом месте должна быть рекурсия
recovery_field(primaty_field, field, size);
//cout << grow[0] << " " << grow[1] << endl;
//print(primaty_field, size);
}
}
growth_sequence(grow); //меняем Grow для следующего обхода.
}
Просто создаете копию вашего массива. Проводите изменения над исходным массивом и передаете ранее созданную копию на следующую ступень рекурсии, либо проводите изменения над ранее созданной копией и передаете исходный массив на следующую ступень рекурсии.
Так как мне не понятно что вы хотели делать и для чего столько условных операций, отвечу только на вопрос: как не изменять массив более одного раза (если я вас правильно понял).
В самой функции, где у вас меняются данные массива, обьявляйте статический булевский обьект(или типа int) и после любого изменения в массиве, меняйте и его значение и по этому значению определите менять данные или нет. Например:
void some_function(Some_type* m, ...) {
static bool b = false;
if(!b) {
// действия, изменяющие массив
b = true;
// после этого, при следующем вызове функции
// условие не выполнится и никакого действия не произойдет
}
}
Виртуальный выделенный сервер (VDS) становится отличным выбором
Гуглиться за 1 минутуВ интеррнете куча информации на этот счет
Подскажите, как более правильнее и элегантнее решить следующую задачу: