2017-02-04 4 views
0

Я пытаюсь понять рекурсию и возвраты со стандартной строкой перестановки алгоритмом (swap --> permute --> swap)Установка «п» вкладка в PRINTF заявлении

Так как я не могу получить мою голову вокруг того, как он откатывается, меняет местами символы и переставляет , Я попытался вставить printfs при каждом вызове recursive permute() с добавлением «уровней» отступов. Во всяком случае вот код:

void permute(char arr[], int L, int R, int level) 
{ 
    int i = 0; 
    level = level+1; 

    if(L == R) 
    { 
     printf("%*s", level, "\t"); 
     printf("printing : %s\n", arr); 
    } 
    else 
    { 
     for(i = L; i <= R; i++) 
     { 
      printf("%*s", level, "\t"); 
      printf("swapping %c with %c\n", arr[L], arr[i]); 
      SWAP(&arr[L], &arr[i]); 

      permute(arr, L+1, R, level); 

      printf("%*s", level, "\t"); 
      printf("swapping back %c with %c\n", arr[i], arr[L]); 
      SWAP(&arr[L], &arr[i]); 
     } 
    } 
} 
int main() 
{ 
    char str[] = "abc"; 
    permute(str, 0, 2, 0); 
    return 0; 
} 

То, что я хочу printf("%*s", level, "\t"); поставить Инкрементирование вкладки, как мы идем в более глубокие рекурсивных уровней. Но это не работает, и я получаю блок текста, сдвинутый на одну вкладку.

swapping a with a 
swapping b with b 
printing : abc 
swapping back b with b 
swapping b with c 
printing : acb 
swapping back b with c 
swapping back a with a 
swapping a with b 
swapping a with a 
printing : bac 
swapping back a with a 
swapping a with c 
printing : bca 
swapping back a with c 
swapping back a with b 
swapping a with c 
swapping b with b 
printing : cba 
swapping back b with b 
swapping b with a 
printing : cab 
swapping back b with a 
swapping back a with c 

Любая идея, как получить Printf вставить (level * '\t') вкладки?

ответ

0

* в строке формата не число повторений; это минимальная ширина поля. Если level - 19, то %*s напечатает 19 символов, но в строке будет только одна вкладка, поэтому она всегда будет печатать только одну вкладку и 18 пробелов. Строка будет правильно обоснована (нет знака - для выравнивания слева), поэтому будет 18 пробелов и вкладка.

#include <stdio.h> 

int main(void) 
{ 
    int level = 19; 
    printf("[%*s]\n", level, "\t"); 
    return 0; 
} 

Вам нужна строка вкладок, таких как "\t\t\t\t\t\t\t\t\t\t\t\t", который длиннее, чем самый глубокий уровень вы будете идти к. Или вам нужно крошечное функцию отступа соответствующее количество вкладок:

static inline void indent(int n) 
{ 
    for (int i = 0; i < n; i++) 
     putchar('\t'); 
} 

и называют, что перед вызовом printf().

+0

Спасибо. 'indent()', похоже, работает нормально. – tcpip

1

Вы можете использовать цикл for: eg.

for(int j = 0;i<level;j++) 
    printf("\t"); 
+0

Необходимо заменить «i» на что-то другое («j») и l для уровня –

+0

Я могу. Но мне было интересно, работает ли 'printf ("% * s ", level," ")' с вкладками. – tcpip

+0

@tcpip: Он работает - он работает не так, как вы хотите, чтобы он работал. –

Смежные вопросы