получить уровень рекурсии на языке Си? - PullRequest
0 голосов
/ 13 мая 2011

Я писал рекурсивную функцию (на языке Си), и мне нужен был способ узнать, закончилась ли рекурсия. Интересно, смогу ли я сделать это без переменных или флагов? С функцией например.

Например, если рекурсия прошла на 3 уровня ниже, а затем снова поднялась, есть ли способ проверить, нахожусь ли я на уровне 1 .... не используя флаги?

Лев 1 -> Лев 2 -> Лев 3 -> Лев 2 -> Лев 1 (проверьте здесь)

Ответы [ 5 ]

3 голосов
/ 13 мая 2011

Вам необходимо добавить дополнительный аргумент в вашу функцию в соответствии с int level.Затем передайте рекурсивный вызов level+1 и передайте 0 (или 1, если хотите) на начальный вызов.

0 голосов
/ 13 мая 2011

, если вы хотите играть со стеком ...

int  func(void *p,int n, int stacksize)
{
 char marker;
 int depth =  (int)p -(int)&marker ;
 printf("%d --- %d --- %d\r\n", n,depth, stacksize?depth/stacksize:0);
 if (n>10)
    return depth ;

 return func(p,n+1,stacksize);
}


int main()
{
  char marker;
  int onepass = func(&marker,11,0);

  func(&marker,0,onepass );
  return 0;
}
0 голосов
/ 13 мая 2011

Возможно, вы можете просто проверить стек вызовов, но это будет зависеть от реального уровня или рекурсии, с которой вы имеете дело, иначе, если это только для целей отладки / понимания, используйте решение R ..

0 голосов
/ 13 мая 2011

Ответ зависит от актуальной проблемы. Без сохранения какого-либо флага вы не можете сказать (в переносном смысле, то есть).

Однако, возможно, что ваша рекурсивная функция изменяет некоторые данные таким образом, что она может определить, ранее ли она уже входила в определенную глубину рекурсии. С другой стороны, это просто сложный способ сказать, что вы храните значение флага.

0 голосов
/ 13 мая 2011

Если вас не волнует переносимость, вы можете раскрутить стек вызовов вручную.Но я подозреваю, что решение R значительно лучше для вашей проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...