Передача массива в рекурсивную функцию

165
07 апреля 2019, 22:10

У меня есть рекурсивная функция,которая вызывает саму себя 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 для следующего обхода. 
 
}

Answer 1

Просто создаете копию вашего массива. Проводите изменения над исходным массивом и передаете ранее созданную копию на следующую ступень рекурсии, либо проводите изменения над ранее созданной копией и передаете исходный массив на следующую ступень рекурсии.

Answer 2

Так как мне не понятно что вы хотели делать и для чего столько условных операций, отвечу только на вопрос: как не изменять массив более одного раза (если я вас правильно понял).

В самой функции, где у вас меняются данные массива, обьявляйте статический булевский обьект(или типа int) и после любого изменения в массиве, меняйте и его значение и по этому значению определите менять данные или нет. Например:

void some_function(Some_type* m, ...) {
    static bool b = false;
    if(!b) {
       // действия, изменяющие массив
        b = true;
       // после этого, при следующем вызове функции
       // условие не выполнится и никакого действия не произойдет
    } 
}
READ ALSO
Как мне сделать функцию для добавления элемент в заданую позицию односвязного списка?

Как мне сделать функцию для добавления элемент в заданую позицию односвязного списка?

Гуглиться за 1 минутуВ интеррнете куча информации на этот счет

130
c++: передача внешних параметров при поиске значений в векторе (при определённом операторе &lt;, &gt;)

c++: передача внешних параметров при поиске значений в векторе (при определённом операторе <, >)

Подскажите, как более правильнее и элегантнее решить следующую задачу:

178
буквенный поиск в vector

буквенный поиск в vector

При создании кнопки поиска компилятор выдает ошибку:

249