我正在为我的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)
终于想通了。这是调度方法的代码,漂亮、简短、甜蜜,基本上,左上角值 + (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)
| 归档时间: |
|
| 查看次数: |
1602 次 |
| 最近记录: |