Как я могу написать эту функцию, не используя l oop? (пока) я могу использовать только рекурсию - PullRequest
0 голосов
/ 11 апреля 2020
    void draw(int x[max], int a, int bh) {
    int i;
    if(a<=max){
    if([root]!=-1)
        {
        if(
           draw(x,2*a+1,depth
           for(i=0;i<bi++)
        {
               printf("\t");
        }
           printf("%d\n",x[a]);
        if(b>0)
        {
           draw(x,2*a+2,b-1);
           }
       }
   }

}

как я могу написать этот код без l oop? (без, пока) Я могу использовать только рекурсию.

Ответы [ 2 ]

1 голос
/ 11 апреля 2020

Я не думаю, что вы должны избегать l oop, используемого для создания отступа, но его действительно можно заменить на рекурсию.

Чтобы найти рекурсивное решение для печати N вкладок, мы спросили себя: как я могу определить печать N вкладок с точки зрения печати различного количества вкладок?

Ну, вы можете напечатать N вкладок, напечатав одну вкладку, а затем напечатав N-1 вкладок.

void print_indent(unsigned i) {
   if (!i)
      return;

   printf("\t");
   print_indent(i-1);
}

print_indent(depth);

Фактически любой l oop может быть заменен рекурсией.

Мы знаем, что можем исключить рекурсию хвостового вызова с помощью al oop. Делая процесс в обратном порядке, мы знаем, что

while (cond()) {
   body();
}

можно записать как

void recursive_loop() {
   if (!cond())
      return;

   body();
   recursive_loop();
)

Мы также знаем, что

for (init(); cond(); post()) {
   body();
}

- это просто еще один способ запись

init();
while (cond()) {
   body();
   post();
}

, поэтому

for (int i=0; i<depth; ++i) {
   printf("\t");
}

можно записать как

void print_indent(int depth, int i) {
   if (i >= depth) {
      return;

   printf("\t");
   ++i;
   print_indent(depth, i);
}

int i = 0;
print_indent(depth, i);
0 голосов
/ 11 апреля 2020

Вы можете создать другую рекурсивную функцию для печати \t:

void print_rec (int i){
   if(i > 0) {
      printf("\t");
      print_rec(i-1);
   } else {
    return;
   }
}

, затем в вашей функции:

// replace for loop by print_rec function
print_rec(depth); 
...