1

Тема: Виведення нумерованого списку через рекурсію

Суть така:
Є клас бінарного дерева Tree, який сберігає в упорядкованому стані інформацію с телефонними абонентами. В класі Tree є метод, який виводить весь список на екран:

void Tree::Print(Subscriber * Node)
{
   if(Node != 0)
   {
      Print(Node->left);
            printf ("%-35s %-20s %9d %15s\n", Node->FIO, Node->Town, Node->YearOfBirth, Node->Number);
      Print(Node->right);
   }
}

Не можу збагнути як вивести цей список із нумерацією стрічок? Як в циклі це зробити - зрозуміло:

for (int i = 1; i<...; i++)
    cout<<i<<". "<</*якісь дані*/<<endl;

Але рекурсія працює зовсім по-іншому, і в мене нічого не виходить. То виводить всі стрічки з однаковим номером, то вони постійно змінюються із кожним визовом Print (). Підкажіть, будь ласка, я це можна зробити, а то у нас такий гарний викладач, що сам не зміг змістовно відповісти на це питання :/

2

Re: Виведення нумерованого списку через рекурсію

Можливо якось так.

void Tree::Print(Subscriber * Node)
{
  if(Node != 0)
  {
    Print(Node->left);
    static int counter( 0 );
    printf("%d. %-35s %-20s %9d %15s\n", ++counter, Node->FIO, Node->Town, Node->YearOfBirth, Node->Number);
    Print(Node->right);
  }
}

3

Re: Виведення нумерованого списку через рекурсію

У вас тут є 2 варіанти:
- використовувати зовнішню відносно функції змінну (глобальну, елемент класу, статичну, як радить Arete);
- передавати номер в функцію і повертати новий, десь так:

int Tree::Print(Subscriber * Node, int lineCount)
{
  if(Node != 0)
  {
    lineCount = Print(Node->left, lineCount);
    printf("%d. %-35s %-20s %9d %15s\n", ++lineCount, Node->FIO, Node->Town, Node->YearOfBirth, Node->Number);
    lineCount = Print(Node->right, lineCount);
  }
  return lineCount;
}

Недолік першого варіанту - функція буде нумерувати рядки без обнулення, тобто якщо вперше вивелось 50 рядків, то другий виклик почнеться з номеру 51. Занулення доведеться або робити в іншій функції (забув викликати - маєш баг), або передавати в функцію окремий параметр "занулити". Втім, це можна (як і в другому варіанті) зробити типовим значенням параметру:

int Tree::Print(Subscriber * Node, int lineCount = 0)//тепер без другого параметру в функцію піде 0
Подякували: 0x9111A, Arete, Faltfromoss3

4

Re: Виведення нумерованого списку через рекурсію

koala написав:

У вас тут є 2 варіанти:
- використовувати зовнішню відносно функції змінну (глобальну, елемент класу, статичну, як радить Arete);
- передавати номер в функцію і повертати новий, десь так:

int Tree::Print(Subscriber * Node, int lineCount)
{
  if(Node != 0)
  {
    lineCount = Print(Node->left, lineCount);
    printf("%d. %-35s %-20s %9d %15s\n", ++lineCount, Node->FIO, Node->Town, Node->YearOfBirth, Node->Number);
    lineCount = Print(Node->right, lineCount);
  }
  return lineCount;
}

Недолік першого варіанту - функція буде нумерувати рядки без обнулення, тобто якщо вперше вивелось 50 рядків, то другий виклик почнеться з номеру 51. Занулення доведеться або робити в іншій функції (забув викликати - маєш баг), або передавати в функцію окремий параметр "занулити". Втім, це можна (як і в другому варіанті) зробити типовим значенням параметру:

int Tree::Print(Subscriber * Node, int lineCount = 0)//тепер без другого параметру в функцію піде 0

Дуже дякую, використав другий варіант із параметром за умовченням, все запрацювало  *THUMBSUP*