プロが教える店舗&オフィスのセキュリティ対策術

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

A 回答 (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
    • good
    • 0
この回答へのお礼

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

お礼日時:2004/12/12 16:02

やり方はいろいろあります。

まず、どんな方法でやったら順列生成できるか考えてください。

やり方の一例です。(解説はしません)
#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;
}
    • good
    • 0
この回答へのお礼

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

お礼日時:2004/12/12 16:04

こちらが、参考になるかと・・・


http://www.altum.jp/math/exp1/task/perm.c
http://www.sra.co.jp/people/miyata/algorithm/gen …

参考URL:http://www.altum.jp/math/exp1/task/perm.c,http://www.sra.co.jp/people/miyata/algorithm/gen …
    • good
    • 0
この回答へのお礼

ありがとうございました

お礼日時:2004/12/12 16:06

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!