Возможна ли рекурсия в статической функции? - PullRequest
4 голосов
/ 22 мая 2010

Можно ли написать рекурсивную статическую функцию на C?

Ответы [ 3 ]

14 голосов
/ 22 мая 2010

Да.Когда вы применяете static к функции, это не то же самое, что статическая переменная в рекурсивной функции (что является проблемой).

Первый просто контролирует, видна ли функциявне модуля компиляции (например, для компоновщика).

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

Итак:

static unsigned int fact (unsigned int n) {
    if (n == 1U) return 1;
    return n * fact (n-1);
}

в порядке, но:

static unsigned int fact (unsigned int n) {
    static unsigned int local_n; // would be fine if not static!
    local_n = n;
    if (local_n == 1U) return 1;
    return local_n * fact (local_n-1);
}

равно , а не , поскольку статическая переменная будет повреждена.

3 голосов
/ 22 мая 2010
#include <stdio.h>

static void count_to_five(void)
{
   static int i = 0;

   while (i < 5) {
     i++;
     printf("%d\n", i);
     count_to_five();
   }

  puts("You are seeing this because I counted to five! (did not enter loop)\n");    
  return;
}

int main(void)
{
    count_to_five();
    return 0;
}

Итак, да. Обратите внимание: статическое хранилище для i означает, что оно сохраняет свое значение при каждом вызове count_to_five(). Однако count_to_five() необязательно определять как static.

Очень сложно сказать, о чем ты спрашиваешь.

2 голосов
/ 22 мая 2010

Да, а почему нет?!

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