3

Java では、最大数までdの整数の次の一般的なコードがあります(したがって、このコードは、その範囲内のすべての値に対して繰り返されます)。2, 3, 4, ..., dmaxdmax : d < dmaxd

// d is the number of wrapper loops
int[] ls = new int[d];
...
// let ls array be filled with some arbitrary positive numbers here
...
// first wrapper loop
for (int i1 = 0; i1 < ls[0]; i1++) {

    ...

        // last wrapper loop
        for (int id = 0; id < ls[d - 1]; id++) {

            // internal loop
            for (int j = id + 1; j < ls[d - 1]; j++) {

                myCode();

            }

        }

    ...

}

その場合はd = 3次のようになります。

int ls = new int[3];
ls[0] = 5; ls[1] = 7; ls[2] = 5;

for (int i1 = 0; i1 < ls[0]; i1++) {

    for (int i2 = 0; i2 < ls[1]; i2++) {

        for (int i3 = 0; i3 < ls[2]; i3++) {

            for (int j = i3 + 1; j < ls[2]; j++) {

                myCode();

            }

        }

    }

}

繰り返されるコードをすべて 1 つの一般化されたコードにまとめたいと考えています。その目的のために、while以下のようにループと再帰を使用できます。

int d = 2, dmax = 10;
while (d < dmax) {
    // in algorithm ls is pre-filled, here its length is shown for clearance
    int[] ls = new int[d];
    for (int i = 0; i < ls[0]; i++) {
        doRecursiveLoop(1, d, -1, ls);
    }
    d++;
}

doRecursiveLoop(int c, int d, int index, int[] ls) {

    if (c < d) {
        for (int i = 0; i < ls[c]; i++) {
            // only on the last call we give the correct index, otherwise -1
            if (c == d - 1) index = i;
            doRecursiveLoop(c + 1, d, index, ls);
        }
    } else {
        for (int j = index + 1; j < ls[d - 1]; j++) {

            myCode();

        }
    }

}

再帰なしで動的に発生するネストされたループのこの問題にどのようにアプローチするかについて、誰かが光を当てることができますか?

4

1 に答える 1

1

ここでは実質的に末尾再帰があります。末尾再帰関数は、ループを使用して簡単に反復関数に変換できます。

例えば:

void foo() {
    // ... Stuff ...

    if (someCondition) {
        foo();
    } else {
        bar();
    }
}

になります:

void foo() {
    while (someCondition) {
        // ... Stuff ...
    }
    bar();
}
于 2013-02-20T17:29:08.060 に答える