Je travaille sur une mission des devoirs pour ma classe Java et je suis coincé sur la manière de configurer la récursivité (obligatoire) pour le faire fonctionner. Nous devons inviter l'utilisateur à un certain nombre de concurrents «N» (supposer que cela doit être une puissance de 2, nous ne sommes pas obligés de vérifier la saisie de l'utilisateur valide). Chaque équipe doit jouer chaque équipe une seule fois. La sortie pour n = 8 devrait être: Le seul paramètre que je suis autorisé à passer à la méthode est "INT N". Donc, s'il y a 16 équipes (c.-à-d. N = 16), le deuxième appel passerait 8, puis passer 4, puis 2, puis et éventuellement 1. P> Ainsi, en fonction de cela, je reconnais que tous les autres La ligne baste chaque paire de chiffres. Donc, pour 2 ^ 0, il n'y a qu'une seule équipe. Pour 2 ^ 1, c'est: p> pour 2 ^ 2, il s'agit de 4 équipes, mais les équipes 3 et 4 ont la même récursion que les équipes 1 et 2. ALORS, Vous les échangez les deux 3 et 4 viennent avant 1 et 2, puis vous échangez à nouveau les paires individuelles: p> afin que vous puissiez diviser fondamentalement le diagramme en 4 coins égaux et Chaque coin opposé est égal à l'autre. P> J'ai parcouru un certain nombre de variations de mon code au cours des deux derniers jours, mais voici où je suis en ce moment. C'est en fait un pas en arrière de l'endroit où j'étais, mais j'essayais à l'origine de passer une rangée de départ et un Col de départ, mais j'ai été informé que je ne devais pas le faire, et simplement passer de nouveau de récursivité. P> 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();
}
}
3 Réponses :
Je n'ai pas pu réparer votre code ..... ma solution:
p >
public class MyArray {
final int MAXROW = 32, MAXCOL = 32;
int A[][]; //reference variable
MyArray() {
A = new int[MAXROW][MAXCOL];
}
public static void main(String[] args) {
MyArray m = new MyArray();
int n = 8;
m.mySchedule(n);
m.printA(n);
}
void mySchedule(int n) {
mySchedule(n, 0, 0, n);
}
void mySchedule(int n, int row, int col, int carry) {
if (n == 1) {
A[row][col] = carry; //Trivial Case
} else {
//divide the problem into 4 subproblems
int k = n / 2;
mySchedule(k, row, col, carry - k);
mySchedule(k, row, col + k, carry);
mySchedule(k, row + k, col, carry);
mySchedule(k, row + k, col + k, carry - k);
}
}
void printA(int n) {
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
System.out.print(A[i][j] + "\t");
}
System.out.println();
}
}
}
Voici ma version actuelle du code. Mon professeur dit toujours qu'il peut être plus efficace en supprimant le 2e appel récursif. J'ai inclus tous mes commentaires alors je me suis souvenu de ce que chaque chose a réellement fait.
class MySchedule {
final int MAXSIZE = 32;
int A[][]; //reference variable
int max; //number of integers in A, <= MAXSIZE
int row = 1; //keeps track of rows during recursion, row 0 set during user input
//constructor
MySchedule() {
A = new int[MAXSIZE] [MAXSIZE];
max = 0;
}
/*
if teams = 4, then movements per row are: 2^0, 2^1, 2^0
if teams = 8: 2^0, 2^1, 2^0, 2^2, 2^0, 2^1, 2^0
(n/2) gives us the correct power to calculate movements
for each value of n, we move n places in either direction
for loop iterates ever 2*n
outer loop is for each iteration
inner loops are each number of movements for each iteration
*/
void schedule(int n) {
if (n >= 1) {
schedule(n/2);
//start at column 0 for each row
int col = 0;
for (int i = 0; i < max; i += (2*n)) {
//current position uses value from previous n rows/columns.
for (int j = 0; j < n; j++)
A[row][col+j] = A[row-n][col+j+n];
for (int j = n; j < n*2; j++)
A[row][col+j] = A[row-n][col+j-n];
col += 2*n;
}
row++;
if (n > 1)
schedule(n/2);
}
}
void printA() {
//print header, then print team schedule
System.out.printf("%4s", "day");
System.out.printf("%12s", "teams");
System.out.println();
printA(max-1);
}
void printA(int n) {
if (n >= 0) {
printA(n-1);
//n=0 is the row to list the teams.
//Following rows indicate which team they play on which day
if (n == 0)
System.out.printf("%4s", "");
if (n >= 1)
System.out.printf("%4s", "D"+n);
for (int c = 0; c < max; c++)
System.out.printf("%3d", (A[n][c]));
System.out.println();
}
}
}
public class Hw10 {
//determine if n is a 2's power
static boolean isPow(int n) {
while (n > 1) {
if (n%2 != 0)
return false;
n = n / 2;
}
return true;
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int teams;
//prompt user input for teams and print schedule
do {
System.out.print("How many teams (0 to exit): ");
teams = in.nextInt();
//check to make sure user input is a power of 2.
do {
if (isPow(teams) == false) {
System.out.println("Invalid input, must be a power of 2.");
System.out.print("How many teams (0 to exit): ");
teams = in.nextInt();
}
} while (isPow(teams) == false);
//initialize array to avoid out of bounds errors on repeat tries
MySchedule sched = new MySchedule();
//initialize first row of array with number of teams
for (int i = 0; i < teams; i++)
sched.A[0][i] = i+1;
sched.max = teams;
sched.schedule(teams/2);
sched.printA();
System.out.println();
} while (teams > 0);
}
}
Je pense que "initialiser la première ligne de matrice avec nombre d'équipes" devrait être dans le constructeur de myschedule code> ...... pour (int i = 0; i
finalement compris. Voici le code de la méthode de planification, agréable et court et sucré, fondamentalement, les valeurs supérieures gauche + (n / 2) = les valeurs supérieure droite et inférieure gauche. Valeurs de bas droite = Valeurs supérieures gauche.
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];
}
}
}
}
beaucoup mieux, même si j'utilise le paradigme récursif, je préfère ne pas utiliser de boucles ..... Cependant, j'aime votre solution
@ Josericardobustosm.Manks Jose. Cela ne m'a pris que comme 4 jours pour la faire bouillir à cela. Ma réponse originale était beaucoup plus élaborée, mais tout le seul appel récursif dans le code et qui ne passe que 1 paramètre dans la récursivité me déroutait vraiment me déroutant.
" Le seul paramètre que je suis autorisé à passer à la méthode est" INT N ". I>" Est-ce que cette méthode doit être récursive ou indiquer que le scénario
résoudre (n) {retour recursivemethod (x, y, z);} code> est autorisé?Je vais vous donner un indice: ce problème est similaire à la permutation, mais travaillant au lieu de travailler avec des chaînes et des caractères avec les chiffres.
@Shang Ce problème est résolu avec une fonction récursive ....
Mon professeur m'a enfin écrit et m'a dit que la voie la plus efficace et la plus préférée est de faire un appel de calendrier récursif (INT) et à chaque fois que vous passez «N», vous divisez par 2. J'ai une solution de travail maintenant, mais elle Appelle la méthode récursive deux fois et il a rendu évident dans ma classe ce soir qu'il prendra des points de congé même s'il fonctionne et fournit les résultats corrects. J'ajouterai également ma réponse actuelle ci-dessous.
@Pshemo Je n'ai autorisé qu'à utiliser 1 paramètre pour la résolution. Et je n'ai que je n'ai autorisé à l'appeler une fois à partir de la méthode. Consultez ma réponse ci-dessous pour le voir travailler avec 2 appels à l'intérieur de la méthode au lieu de 1.