- ベストアンサー
プログラミング
題のとおりです。 1~nの整数を並び替えてできる順列をn!個全て表示する再帰を用いたプログラミングって存在しますか???もし、このプログラミングができる人がいらっしゃったら教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
/* 1~nまでのの順列の並びを表示する */ #include <stdio.h> #define N 10 #define USED 0 void Permutation(int level); void display(void); int selectList[N]; int AnswerList[N]; void main(void){ int i,Level=0; for(i=0;i<N;i++){ AnswerList[i]=0; /* 多分必要ない */ selectList[i]=i+1; /* selectList[]={1,2,3,4,5,6,7,8…,N }; */ } Permutation(Level); } void Permutation(int level){ int i,pos; if(level == N){ display(); return ; } for(i=0;i<N;i++){ if(USED==(pos=selectList[i]))continue; AnswerList[level]=pos; selectList[i]=USED; /* 選択した数を使用済みにする */ Permutation(level + 1); selectList[i]=pos; /* 次のループの為に戻す */ } } void display(void){ int i; printf("[ "); for(i=0;i<N;i++) printf("%d ",AnswerList[i]); printf("]\n"); } 実際に実行してみるには、Nをもっと小さくした方がいいかもです 数値でなくて、記号(1文字)でやる場合には、 参考URLを見て下さい。 http://okweb.jp/kotaeru.php3?qid=1038917
その他の回答 (2)
- JaritenCat
- ベストアンサー率37% (122/322)
やり方はいろいろあります。まず、どんな方法でやったら順列生成できるか考えてください。 やり方の一例です。(解説はしません) #include <stdio.h> #define N 5 int p[N]; /* 数値を入れ替える */ void swap(int *a, int *b) { int t; t= *a; *a= *b; *b=t; } /* 数字を表示する */ void printN(void) { int i; for (i=0; i<N; i++) { printf("%d ",p[i]); } printf("\n"); } /* 入れ替えながら再帰 */ void perm(int n) { int i; if (n==0) { printN(); } else { perm(n-1); for (i=n-1; i>=0; i--) { swap(&p[n],&p[i]); perm(n-1); swap(&p[n],&p[i]); } } } int main(void) { int i; for (i=0; i<N; i++) p[i]=i+1; /* pに1からNまでの数字をセット */ perm(N-1); return 0; }
お礼
非常に参考になりました。ありがとうございました。
- edomin
- ベストアンサー率32% (327/1003)
お礼
非常に参考になりました。ありがとうございました。