C Строка рекурсии копирует стек или ...? - PullRequest
0 голосов
/ 03 декабря 2018

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

 char c[500]; 

У меня есть следующая функция, которую я написал для своего назначения: (По сути, это дерево, инфиксный порядок, если левый узел существует, напишите 0 (1 длянаправо) в буфер в позиции i, иначе напишите '\ 0' и напечатайте буфер).

void imprimer_codes (node *b, char *c, int i) {
  assert(c);
  if (!b) return;

  if (est_feuille(b)) {
    c[i] = '\0';
    printf("%s:%c\n",c,b->symbol);
  }

  if (b->fg) {
    c[i] = '0';
    imprimer_codes(b->fg,c,i+1);
  }

  if (b->fd) {
    c[i] = '1';
    imprimer_codes(b->fd,c,i+1);
  }
}

Так как я использую его рекурсивно.Я не понимаю, как функция может на самом деле печатать несколько разных буферов, так как в буфере есть несколько \ 0.

Копируется ли указатель на c [500] в память стека?Это может быть единственное объяснение, которое я могу найти.

1 Ответ

0 голосов
/ 03 декабря 2018

Так как я использую его рекурсивно.Я не понимаю, как функция может на самом деле печатать несколько разных буферов, так как в буфере есть несколько \ 0.

Это довольно просто.В качестве примера рассмотрим дерево,

   *
 /   \
x    ...

То есть с листом слева и некоторым поддеревом справа. Начнем с

i = 0, c = [] 

Ваш алгоритм сначала идет влево(все еще должно идти направо),

i = 1, c = [0]

Это лист, поэтому он добавляет ноль,

i = 1, c = [0, \0]

и печатает.Эта ветвь выполнена так, что она возвращается, и мы имеем,

i = 0, c = [0, \0]

помните, i передается по значению, но c - это массив, а массивы передаются по ссылке.Итак, мы идем направо,

i = 1, c = [0, 1]

, и ноль исчез.

Еще один пример, когда ноль не переопределяется.Предположим,

    *
  /   \
 /     y
x   

Вы дважды идете влево,

i = 0, c = []
i = 1, c = [0]
i = 2, c = [0, 0]

, затем добавляете ноль и печатаете

i = 2, c = [0, 0, \0]    

, так как на правой стороне только ветвькорень, вот куда он будет возвращаться,

i = 0, c = [0, 0, \0]     

, а затем он идет вправо,

i = 1, c = [1, 0, \0]     

, и это лист, поэтому мы добавим ноль и напечатаем его,

i = 1, c = [1, \0, \0]     

Я думаю, этого должно быть достаточно, чтобы понять, что происходит.

Точка сразу после вставки \0 вы возвращаетесь к меньшему i и продолжаете строить новую строку оттуда.Так что ни в коем случае у вас не будет позиции \0 до вашей текущей i.

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