アプリ版:「スタンプのみでお礼する」機能のリリースについて

いま、配列を作る作業をしているのですが、for文を使うと、forをいくつ書けば良いのか分からない状態です。

作ろうとしている配列が、A[X][Y]で、Xの要素数は固定で良いのですが、Yの要素数が実験のたびに変動するためです。そして、処理したいのが、この配列の各列の値を適当な値(このfor文の前に値が決まっています)を代入することです。

例えば、for文だと、Y=3のときには
for(i=0;i<○;i++){
for(j=0;j<○;j++){
for(k=0;k<○;k++){
A[line][0] = C[i];//(Cという配列のi成分)
A[line][1] = B[j];
A[line][2] = E[k];
}
}
}
のように書くような内容なのですが、Yが増えると、for文も増やさないといけません。
ここで、再帰処理のような方法をつかってうまく書きたいのですが、どう書いたら良いのか分かりません。
一般的なfor文の書き換え方みたいなことでも良いので、教えて頂けませんか?宜しくお願いします。

A 回答 (5件)

#2 さんと同じ考えですが、いまいち、質問の意味がわかりません。



例えば、for文だと、Y=3のときには
for(i=0;i<○;i++){
for(j=0;j<○;j++){
for(k=0;k<○;k++){
A[line][0] = C[i];//(Cという配列のi成分)
A[line][1] = B[j];
A[line][2] = E[k];
}
}
}


ではYが増えて、Y=4やY=5だと、どのようにfor()文が変わるのですか?
    • good
    • 0

訂正です


> ○が共通だったら、Y=3なら、○進数3桁と考えて、 k*3^2+j*3+i とする。

○が共通だったら、Y=3なら、○進数3桁と考えて、 k*○^2+j*○+i とする。
    • good
    • 0

作ろうとしているものの条件がよくわからないのですが?



毎回違うのは Y だけですか?
それとも、(この例なら) C,B,Eの長さもですか?

また、C,B,Eの長さは共通(質問中の○が同じ値になる)ですか?
それとも、一定の法則で計算できるものですか?
それとも、それぞれ独立ですか?


例えば、こんなやりかたはあります。
・C.B.Eといった個別の配列では、ループや再帰には向かないので、 T[0]=C, T[1]=B, ...のような配列の配列とか、ポインタの配列にする。
・i,j,k...の値と一対一で対応する値の計算方法を考える。
○が共通だったら、Y=3なら、○進数3桁と考えて、 k*3^2+j*3+i とする。
・forの2重ループ。
for( idx=0;idx < ○のY乗 ; ++ idx ) {
temp_idx=idx ;
for( y=0; y < Y; ++y ) {
i0 = temp_idx % ○ ; // 余りで、下の桁を取り出す
temp_idx /= ○ ; // 一桁シフト
A[line][y] = T[y][i0] ;
}
/* この位置にAを使った処理が入らなければ */
/* idxのループは無意味なのは、既に指摘のある通り */
}
    • good
    • 0

>Yが増えると、for文も増やさないといけません。


 Yが増えたときに増やすのは、forのループ回数でfor文ではない。
    • good
    • 0

>再帰処理のような方法をつかってうまく書きたいのですが



それ以前にやりたい事が良く分かりません。
例としてソースを書くにしても、もう少し前後の処理を含め、値の確定など詳細に書いた上で質問した方が良いと思います。

少なくとも今の例では、
for(i=0;i<○;i++){
for(j=0;j<○;j++){
for(k=0;k<○;k++){
を仮に
for(i=0;i<10i++){
for(j=0;j<20;j++){
for(k=0;k<30;k++){
と仮定した場合、forループ無しの

A[line][0] = C[10];
A[line][1] = B[20];
A[line][2] = E[30];

と同意ですよ。
それとも、各ループ内で、A[line]の初期化と処理がクローズされていると言う事ですか?

まずは、「初期化」だけに絞ってロジックを考え、その上で質問する事をお勧めします。
    • good
    • 0

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