Java Tournament计划递归

Chr*_*ell 11 java recursion

我正在为我的Java类做一个家庭作业,我仍然坚持如何设置递归(必需)以使其工作.我们必须提示用户使用多个'n'个竞争对手(假设它必须是2的幂,我们不需要检查有效的用户输入).每支球队必须只参加一次其他球队.n = 8的输出应为:

1  2  3  4  5  6  7  8
2  1  4  3  6  5  8  7
3  4  1  2  7  8  5  6
4  3  2  1  8  7  6  5
5  6  7  8  1  2  3  4
6  5  8  7  2  1  4  3
7  8  5  6  3  4  1  2
8  7  6  5  4  3  2  1
Run Code Online (Sandbox Code Playgroud)

我被允许传递给方法的唯一参数是'int n'.因此,如果有16支队伍(即n = 16),那么第二次调用将通过8,然后通过4,然后是2,最后是1.

因此,基于此,我认识到每一行都只是翻转每对数字.所以对于2 ^ 0,只有一个团队.对于2 ^ 1,它是:

1  2
2  1
Run Code Online (Sandbox Code Playgroud)

对于2 ^ 2,它是4个团队,但是团队3和4具有与团队1和团队2相同的递归.然后,你交换它们,因此3和4在1和2之前,然后你再次交换各个团队:

1  2  3  4
2  1  4  3
3  4  1  2
4  3  2  1
Run Code Online (Sandbox Code Playgroud)

所以你基本上可以将图分成4个相等的角,每个相对的角相互相等.

在过去的几天里,我的代码经历了很多变化,但这就是我现在所处的位置.这实际上是从我的位置向后退一步,但我原本试图传递一个起始行和一个开始col,但我被告知我不应该这样做,并且只是递归地传递n.

class MyArray {
    final int MAXROW = 32, MAXCOL = 32;
    int A[][]; //reference variable
    int nR, nC; //number of integers in A, <= MAXSIZE

//constructor
MyArray() {
    A = new int[MAXROW] [MAXCOL];
    nR = nC = 0;
}

void schedule(int n) {
        if (n > 1) {
            schedule(n/2);
            for (int r = 0; r < n/2; r++)
                for (int c = 0; c < n/2; c++) {
                    A[r+n][c] = A[r][c+n];
                    A[r+n][c+n] = A[r][c];
                 }
        }
    }
void printA() {
    printA(nC-1)
}

void printA(int n) {
    if (n >= 0) {
        printA(n-1);
        for (int c = 0; c < nC; c++)
            System.out.printf("%3d", (A[n][c]));
        System.out.println();
    }
}
Run Code Online (Sandbox Code Playgroud)

Chr*_*ell 3

终于想通了。这是调度方法的代码,漂亮、简短、甜蜜,基本上,左上角值 + (n/2) = 右上角和左下角值。右下角的值 = 左上角的值。

void schedule(int n) {
    if (n > 0) {
        schedule(n/2);
        if (n == 1)
            A[0][0] = 1;
        else {
            for (int r = 0; r < n/2; r++)
                for (int c = 0; c < n/2; c++) {
                    A[r][c+(n/2)] = A[r][c] + (n/2);
                    A[r+(n/2)][c] = A[r][c] + (n/2);
                    A[r+(n/2)][c+(n/2)] = A[r][c];
                }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)