- ベストアンサー
ループ構文について
N種類の変数がM種類の値を取る場合を考えて、(M^N通りの組み合わせがある) 全ての組み合わせを網羅的に探索するには、どうやってループ構文書けば良いですか? 申し訳ありませんが宜しくお願いいたします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
再起呼び出しを使わない場合は、こんな感じで出来ると思います。 例: #include <stdio.h> #define N_MAX 10 #define M_MAX 100 int parameter[N_MAX]; //parameter[] を使った処理 void check(){ int n; for(n = 0; n < N_MAX; n++){ printf("%3d ",parameter[n]); } putchar('\n'); } void main(void) { int n; for(n = 0; n < N_MAX; n++) parameter[n] = 0; for(n = 0;;n = 0){ check(); while(++parameter[n] >= M_MAX){ parameter[n] = 0; n++; if(n >= N_MAX) return; } } }
その他の回答 (3)
- venzou
- ベストアンサー率71% (311/435)
N重ループを作りたいって事ですよね。 再起呼び出しを使うとシンプルに書けると思います 例: #include <stdio.h> #define N_MAX 10 #define M_MAX 100 int parameter[N_MAX]; //parameter[] を使った処理 void check(){ int n; for(n = 0; n < N_MAX; n++){ printf("%3d ",parameter[n]); } putchar('\n'); } //再起呼び出してparameter[]を設定 void set_parameter(int n){ int m; if(n < N_MAX){ for(m = 0; m < M_MAX; m++){ parameter[n] = m; set_parameter(n+1); } }else{ check(); } } void main(void) { set_parameter(0); }
お礼
うまくいったみたいです!ありがとうございます!
- Oh-Orange
- ベストアンサー率63% (854/1345)
★考え方 ・『N種類の変数』と『M種類の値』を2次配列と同じ考えて検査すれば良いと思います。 ・つまり、『M種類の値』を横要素、『N種類の変数』を縦要素って感じかな。 ・下に簡単なサンプルを載せます。 ●サンプル int n, m; for ( n = 0 ; n < MAX_N_KIND ; n++ ){ for ( m = 0 ; m < MAX_M_KIND ; m++ ){ printf( "N変数(%d)のM値は ⇒ %d\n", n, N[n] ); } } ●解説 ・『MAX_N_KIND』定数が『N種類の変数』の種類数です。 ・『MAX_M_KIND』定数が『M種類の値』の値種類数です。 ・『n』、『m』は単なるカウンタです。 ・『N』配列は『N種類の変数』の配列と表現しています。 ・以上。おわり。
補足
すみませんちょっと説明が足らなかったかもしれないです。 やりたいとしていることは、N*M通りの探索ではなく、N^M通りの探索です。 あえて書けばこんな感じになります↓ int i; for ( i = 0 ; i < M ; i++ ){ for ( i = 0 ; i < M ; i++ ){ for ( i = 0 ; i < M ; i++ ){ for ( i = 0 ; i < M ; i++ ){ ・・・N回続く } } } } 自分で自分を呼び出すみたいななことをしないとダメだと思うんですが…
- PED02744
- ベストアンサー率40% (157/390)
普通に、ループ変数を入れ子にするだけじゃ駄目なのですか? まず、あなたの考えた(ちゃんとできなかった)コーディングを 示していただけますか?
お礼
こちらの方法を使わせていただきたいと思います。 ありがとうございました!