Поведение статических переменных в рекурсии

0

Я говорю со ссылкой на C++. Я знаю, что если int объявлен как статический в рекурсии, его значение не повторно инициализируется в вызове stack-recursion, и используется текущее значение.

Но если стек становится пустым (или вычисление рекурсии завершено), а затем рекурсия вызывается снова, будет ли она использовать то же статическое значение, что и в первом вызове стека?

Я подробно объясню свою проблему.

Я пытаюсь закодировать обход уровня порядка в спиральной форме.

         1
       /   \
      2     3
     / \   / \
    7  6  5  4

Обход порядка порядка в спиральной форме даст выход 1 2 3 4 5 6 7.

void LevelSpiral(node* root, int level)
{
    static int k = level%2;
    if(root==NULL)
        return;
    if(level==1)
    {
        printf("%d ",root->val);
    }
    else
    {
        if(k==0)
        {
            LevelSpiral(root->left,level-1);
            LevelSpiral(root->right,level-1);
        }
        else
        {
            LevelSpiral(root->right,level-1);
            LevelSpiral(root->left,level-1);
        }
    }
}

void LevelOrderSpiral(node* root)
{
    for(int i=1;i<=maxheight;i++)
        LevelSpiral(root,i);
}

Функция LevelOrderSpiral делает отдельный вызов LevelSpiral для каждого i. Но на протяжении всего кода он всегда использует k = 1 (который инициализируется в первом вызове LevelSpiral с я = 1) и выводит результат как 1 3 2 4 5 6 7.

Должна ли она печатать 1 2 3 4 5 6 7, поскольку стек функций повторно инициализируется для каждого i?

  • 0
    Похоже, он должен напечатать 1 3 2 6 7 4 5.
  • 0
    В поведении нет разницы, является ли k постоянным или нет.
Показать ещё 2 комментария
Теги:
data-structures
recursion
stack

2 ответа

1
Лучший ответ

Я знаю, что если int объявлен как const в рекурсии, его значение не повторно инициализируется в вызове stack-recursion, и используется текущее значение.

Нет, это не правильно. const имеет ничего общего с рекурсией или реентракцией.

Но если стек становится пустым (или завершение вычисления рекурсии завершено), а затем рекурсия вызывается снова, будет ли она использовать то же значение const, что и в первом вызове стека?

const является нормальной (хотя и не подлежащей модификации) переменной: она инициализируется всякий раз, когда выполняется инструкция инициализации, то есть при каждом вызове функции. Это то же самое для любой static переменной non-.

static локальные переменные показывают поведение, которое вы описываете: они выполняются только один раз при первом вызове этой функции и, что важно, они не повторно инициализируются даже после того, как стек вызовов "опустел". Не имеет значения, повторяется ли функция извне или рекурсивно.

  • 0
    Извините .... я имел в виду только статические .... исправлено выше ..
  • 0
    Последние две строки - именно то, что я искал .... теперь я ясно ... спасибо ..
2

Вам нужна статическая переменная, для которой значение сохраняется между вызовами или от одного вызова до следующего рекурсивного вызова.

Кроме того, рекурсия не была бы первым инструментом, который я намереваюсь для прохождения по ширине. Я бы использовал очередь узлов (безопасных) указателей (или ссылочных оберток или что-то еще). Поместите корневой узел в очередь, затем зацикливайтесь до тех пор, пока очередь не станет пустой, удалив передний элемент и включив все дочерние узлы и сделайте то, что вы хотите, с недавно удаленным элементом.

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню