では、i のループを消してみよう。
ループを度外視してi[ ] の初期化とインクリンメントを該当箇所にバラしてみる。
long[ ][ ] array = new long[dim][ ];
long[ ] return_value = new long[dim];
int[ ] i = new int[dim];
int d = dim;
//d = dim
if(d < 2){
//d = 1
return_value[d - 1] = array[d - 1][0];
d++;
}else{
if(i[d - 1] == 0){
(B)
}
if(i[d - 1] < d){
(C)
d--;
//d = dim - 1
i[d - 1] = 0;
if(d < 2){
//d = 1
return_value[d - 1] = array[d - 1][0];
d++;
}else{
if(i[d - 1] == 0){
(B)
}
if(i[d - 1] < d){
(C)
d--;
//d = dim - 2
i[d - 1] = 0;
if(d < 2){
//d = 1
return_value[d - 1] = array[d - 1][0];
d++;
}else{
if(i[d - 1] == 0){
(B)
}
if(i[d - 1] < d){
(C)
d--;
i[d - 1] = 0;
//d = dim - 3
//以下省略
//d = dim - 2
(E)
i[d - 1]++;
}
if(i[d - 1] == d){
return_value[d - 1] = value;
d++;
}
}
//d = dim - 1
(E)
i[d - 1]++;
}
if(i[d - 1] == d){
return_value[d - 1] = value;
d++;
}
}
//d = dim
(E)
i[d - 1]++;
}
if(i[d - 1] == d){
return_value[d - 1] = value;
d++;
}
}
これでループは消えたが、これでは単に消してしまっているだけなので、実際の処理としては不味い。
消えたループは、全体のループとして書き換えないといけない。
ただその場合、再帰呼び出しの前後ではループの別々の回になるので、それらを区別する必要がある。
そこで、flg という変数を導入し、全体ループの中で再帰呼び出し前(flg == 0)と呼び出し後(flg == 1)を区別することにする。
long[ ][ ] array = new long[dim][ ];
long[ ] return_value = new long[dim];
int[ ] i = new int[dim];
int d = dim;
int flg = 0;
if(d < 2){
return_value[d - 1] = array[d - 1][0];
d++;
flg = 1;
}else{
if(flg == 0){
if(i[d - 1] == 0){
(B)
}
if(i[d - 1] < d){
(C)
d--;
i[d - 1] = 0;
if(d < 2){
return_value[d - 1] = array[d - 1][0];
d++;
flg = 1;
}else{
if(i[d - 1] == 0){
(B)
}
if(i[d - 1] < d){
(C)
d--;
i[d - 1] = 0;
if(d < 2){
return_value[d - 1] = array[d - 1][0];
d++;
flg = 1;
}else{
if(flg == 0){
if(i[d - 1] == 0){
(B)
}
if(i[d - 1] < d){
(C)
d--;
i[d - 1] = 0;
}
}else{
if(i[d - 1] < d){
(E)
i[d - 1]++;
}
if(i[d - 1] == d){
return_value[d - 1] = value;
d++;
}
}
}
}
}else{
if(i[d - 1] < d){
(E)
i[d - 1]++;
}
if(i[d - 1] == d){
return_value[d - 1] = value;
d++;
}
}
}
}else{
if(i[d - 1] < d){
(E)
i[d - 1]++;
}
if(i[d - 1] == d){
return_value[d - 1] = value;
d++;
}
}
}
これで全ての場合分けが終わったので、全体をループで囲み、多重化されている部分を一段にすると以下のように書ける。
long[ ][ ] array = new long[dim][ ];
long[ ] return_value = new long[dim];
int[ ] i = new int[dim];
int d = dim;
int flg = 0;
do {
if(d < 2){
return_value[d - 1] = array[d - 1][0];
d++;
flg = 1;
}else{
if(flg == 0){
if(i[d - 1] == 0){
(B)
}
if(i[d - 1] < d){
(C)
d--;
i[d - 1] = 0;
}
}else{
if(i[d - 1] < d){
(E)
i[d - 1]++;
flg = 0;
}
if(i[d - 1] == d){
return_value[d - 1] = value;
d++;
flg = 1;
}
}
}
}while(d <= dim);
ここでは、終了条件を d <= dim にしている。
では今日はここまで。