11
votes

Journée Java Tournoi Récursion

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: xxx pré>

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> xxx pré>

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> xxx pré>

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();
    }
}


5 commentaires

" Le seul paramètre que je suis autorisé à passer à la méthode est" INT N ". " Est-ce que cette méthode doit être récursive ou indiquer que le scénario résoudre (n) {retour recursivemethod (x, y, z);} 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.


3 Réponses :


1
votes

Je n'ai pas pu réparer votre code ..... ma solution:

récursif 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();
        }
    }
}


0 commentaires

0
votes

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);
    }
}


1 commentaires

Je pense que "initialiser la première ligne de matrice avec nombre d'équipes" devrait être dans le constructeur de myschedule ...... pour (int i = 0; i



3
votes

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];
                }
        }
    }
}


2 commentaires

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.