2016-04-24 8 views
-5

以下のようにコード化して、3つの番号1,2,3のすべての順列を出力します。再帰を使用してすべての順列を出力します。

しかし、出力は次のようになります。
1,1,1
1,1,2
1,1,3
1,2,1
1,2,2
1,2,3-
コードは以下の通りである:

#include<stdio.h> 
#include<conio.h> 

void perm(int); 

int a[10],l=2; 

int main() 
{ 
    int k; 
    k=0; 
    perm(k); 
    getch(); 
    return 0; 
} 

void perm(int k) 
{ 
    int i; 
    for(a[k]=1;a[k]<=3;a[k]++) 
    { 
     if(k==2) 
     { 
      for(i=0;i<3;i++) 
      { 
       printf("%d ",a[i]); 
      } 
      printf("\n"); 
     } 
     else 
     { 
      k++; 
      perm(k); 
     } 
    } 
} 

P1。正しいコードを教えてください。

+0

ハードコードされた 'if(k == 2) 'の条件は何ですか? –

+1

'(k == 2)'の条件はうまくいくようです。しかし、あなたは[k]が以前に選択していなかったかどうかを確認する必要があります。 – jdarthenay

+0

どの番号が使用されたかを把握する必要があります。そして配列にまだ入っていない番号だけを使用してください。 – user3386109

答えて

0

なぜkが増えますか? kは、特定のコールではperm()に変更しないでください。

また、それは、3つの順列で立ち往生することが少し残念だ、あなたは簡単にこの方法を一般化することができます

#include<stdio.h> 
#include<conio.h> 

static void perm(int, int); 
static void all_perm(int); 

int a[10]; 

int main() 
{ 
    all_perm(3); 
    getch(); 
    return 0; 
} 

void all_perm(int n) 
{ 
    perm(0, n); 
} 

void perm(int k, int n) 
{ 
    if (k == n) 
    { 
     for(int i = 0; i < n; i++) 
     { 
      printf("%d ", a[i]); 
     } 
     printf("\n"); 
    } 
    else 
    { 
     for(a[k]=1; a[k] <= n; a[k]++) 
     { 
      perm(k + 1, n); 
     } 
    } 
} 

編集:さて、あなたは順列に名前を付けることは順列ではありません。

+0

数字は繰り返すことができます。すべての順列を望みます:1,1,1; 1,1,2 .... –

+0

@PranavSaxenaこの数学の名前は順列ではありません**。 – jdarthenay

0

私が使っているロジックは、あなたとある程度類似しています。 私はそれを明確にするためにコード全体を含めました。

#include <stdio.h> 

void recn(int*,int,int); 
void print_arr(int*,int); 
    void main() 
    { 
     int arr[3] = {1,2,3}; 
     recn(arr,3,0); 
    } 

    void print_arr(int *arr, int n){ 
     int i; 
     for(i = 0,printf("\n"); i < n; printf("%d",arr[i++])); 
    } 

    void recn(int *arr, int n, int l) { 
    int i, j, f, k, xx = 0; 
    static int tst[15], a[14]={0}; 

    if (l == n) { 
     for (i = 0; i < n; i++) { 
      tst[i] = arr[a[i]]; 
     } 
     print_arr(tst,n); 
     return; 
    } 
    for (i = 0; i < n; i++) { 
     f = 0; 
     for (j = 0; j < l; j++) 
      if (a[j] == i) 
       f = 1; 

     if (!f) { 
      a[l] = i; 
      recn(arr, n, l + 1); 
     } 
    } 
} 
関連する問題