Переполнение стека с рекурсией

#c

#c

Вопрос:

В моем коде происходит переполнение стека, я действительно не знаю, что его вызывает. Родительский элемент — это фиксированный массив, подобный 14.

 protected:
int* parent = new int[14];
int size = 14;

int Tree::level(int i) {
  int count = 0;

  for (int j = 0; j < size; j  ) {
    if (parent[i] == -1) {
        count = 1;
    } else {
        count = level(i)   1; //this is causing the stack Overlow
    }
  }
  return count;
}
  

Комментарии:

1. если parent[i] есть unsigned , это может быть плохо. Для уверенности попробуйте поставить точку останова в count = 1 условии. Это тоже было бы неплохо знать size … Пожалуйста, добавьте исполняемый пример и убедитесь, что у вас нет предупреждений при компиляции.

2. 14 это не массив, так что вы имели в виду? В любом случае, почему вы вообще используете рекурсию там?

3. Пожалуйста, опубликуйте определение и данные родительского массива. Кроме того, я полагаю, вы имеете в виду level(i 1) ?

4. Не могли бы вы, пожалуйста, предоставить нам больше информации об ошибке? Вы пробовали отладку, чтобы узнать, в каком состоянии была ваша программа на момент сбоя? Можем ли мы увидеть parent массив? Значение size ? Afaik, создание экземпляра 2 int s приведет к переполнению вашего стека слишком большим количеством рекурсии.

5. @J.R. i никогда не меняется, поэтому он должен вызывать одно и то же навсегда

Ответ №1:

Рекурсивный вызов в следующем вызове обязательно вызовет бесконечную рекурсию, поскольку i не изменяется в функции.

 count = level(i)   1;
  

Я предполагаю, что вы имели в виду использовать j or parent[i] вместо i в этом вызове. Трудно сказать, какое значение правильно использовать в рекурсивном вызове без дополнительного контекста.

Комментарии:

1. Не нашел j , вы имели в виду parent[i] ?

2. @Deduplicator, j является переменной цикла. Однако вы приводите еще один обоснованный аргумент. Это может быть parent[i] .

Ответ №2:

В случае выполнения условия parent[i] == -1 false функция «level» становится бесконечно рекурсивной и, следовательно, переполняет стек.