2017-02-04 7 views
0

私は再帰を理解しようと、私はそれが後戻りする方法のまわりで私の頭を取得するように見えることはできませんので、標準の文字列置換アルゴリズム(swap --> permute --> swap)挿入「n」のprintf文のタブ

とバックトラック、文字と並べ替えるを入れ替えています、私はインクリメントのインデント "レベル"ですべての再帰的なpermute()コールでprintfsを挿入しようとしました。とにかく、ここでコードは次のとおりです。

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");です。しかし、それは動作していないと私は1つのタブでシフトされたテキストのブロックを取得しています。

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文字を出力しますが、文字列には1つのタブしかないので、常に1つのタブと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ループを使用できます。例:

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

"i"を他のもの( "j")に交換し、lをレベル –

+0

にすることができます。しかし、 'printf("%* s "、level、" ")'がタブで動作するかどうか疑問に思っていました。 – tcpip

+0

@tcpip:それは動作します。しかし、動作させる方法では機能しません。 –