• ベストアンサー

プログラミング

題のとおりです。 1~nの整数を並び替えてできる順列をn!個全て表示する再帰を用いたプログラミングって存在しますか???もし、このプログラミングができる人がいらっしゃったら教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.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

参考URL:
http://okweb.jp/kotaeru.php3?qid=1038917
kozukozuhito
質問者

お礼

非常に参考になりました。ありがとうございました。

その他の回答 (2)

回答No.2

やり方はいろいろあります。まず、どんな方法でやったら順列生成できるか考えてください。 やり方の一例です。(解説はしません) #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; }

kozukozuhito
質問者

お礼

非常に参考になりました。ありがとうございました。

  • edomin
  • ベストアンサー率32% (327/1003)
回答No.1
参考URL:
http://www.altum.jp/math/exp1/task/perm.c,http://www.sra.co.jp/people/miyata/algorithm/genperm.txt
kozukozuhito
質問者

お礼

ありがとうございました

関連するQ&A