Je n'ai trouvé aucun autre message comme celui-ci, alors j'ai dû demander. Il est facile d'imprimer quoi que ce soit ... mais lorsque vous n'êtes pas autorisé à utiliser des méthodes itératives, les choses se compliquent.

Mon problème est que j'ai deux méthodes dans une classe. Cette classe a une chaîne qui devrait être imprimée à l'envers .. simple avec des méthodes itératives mais pas quand char et int gênent,

J'ai essayé de compter le nombre d'entiers par rapport à la quantité de char dans une chaîne, puis d'utiliser l'autre méthode pour prendre cette même chaîne et compter les int pour l'imprimer à l'envers.

REMARQUE: ces deux méthodes sont nécessaires avec string et int comme paramètres.

Qu'est-ce que je fais mal?

public class PrintRecursive {
private static int j;

public static void main(String[] args) {

    String str = "Hello Everyone!";

    print(str, 0);
    System.out.println(); // Line break
    printReverse(str, 0);
}

private static void printReverse(String str, int i) {
    char ch = (char) i;
    if (ch == ' ') {

    } else
        while (str.contains(str)) {
            i += str.charAt(ch);
        }
}

private static void print(String str, int i) {

    while (str.equals(i)) {
        System.out.println(str.charAt(j--));
    }
}

}

Résultat:

Bonjour à tous! ! enoyrevE olleH

AUSSI: Notez que je suppose que je devrais parler directement aux méthodes au lieu de mon "private int j".

Mon code atm n'est pas récursif !!!!!!! Mais je veux que ce soit le cas, mais je ne peux pas trouver un moyen de le faire.

2
Axwell Smith 26 janv. 2019 à 23:45

3 réponses

Meilleure réponse

Une approche récursive (où une lettre est imprimée à chaque étape de récursivité) pourrait ressembler à ceci:

private static void print(String s, int i) {
    if(i == s.length() - 1)   
        System.out.println(s.charAt(i));
    else {
        System.out.print(s.charAt(i));
        print(s, i+1);
    }
}

private static void printReverse(String s, int i) {
    if(i == 0)
        System.out.println(s.charAt(0));
    else {
        System.out.print(s.charAt(i));
        printReverse(s, i-1);
    }
}

Vous appelleriez cela comme suit:

public static void main(String[] args) {
    print("abcd", 0);
    printReverse("abcd", 3);
}

print() reçoit l'entier 0 comme valeur de départ et printReverse() reçoit la longueur de la chaîne - 1, qui est l'index de la dernière lettre.

1
CyB3RC0nN0R 26 janv. 2019 à 21:00

Quelques problèmes ici. Tout d'abord, dans votre méthode print, vous commencez par comparer une chaîne à un entier dans votre condition de boucle while. De plus, à l'intérieur de votre boucle while, vous décrémentez une variable j alors que je pense que vous devriez utiliser la variable i ici puisqu'elle est transmise. C'est donc probablement ce que vous essayiez de réaliser avec {{X3 }},

private static void print(String str, int i) {
    while (i < str.length()) {
        System.out.print(str.charAt(i++));
    }
}

Maintenant, avec printReverse, vous commencez par transtyper la variable int i qui est passée en un char et comparez cela à ' '. Cela ne sert à rien, car tout entier valide passé ne sera jamais égal à ' ' après un cast de caractères. Je pense que ce que vous vouliez faire dans cette méthode est à peu près la même chose que print mais en sens inverse. Par conséquent, tout ce que vous auriez besoin de changer est la boucle while et l'instruction print,

private static void printReverse(String str, int i) {
    while (i < str.length()) {
        System.out.print(str.charAt(str.length() - i++ - 1));
    }
}

Notez que si vous le souhaitez de manière récursive, vous devez établir un cas de base et un appel récursif à votre fonction. Par exemple, avec print, vous pouvez faire du cas de base la même chose que la condition de la boucle while d'en haut, arrêter d'appeler print quand i >= str.length(), et l'appel à la méthode elle-même peut être effectué après vous avez imprimé le caractère à l'index i tout en incrémentant i,

private static void print(String str, int i) {
    if (i >= str.length()){
        return;
    }
    System.out.print(str.charAt(i++));
    print(str, i);
}

La même logique peut être appliquée pour printReverse,

private static void printReverse(String str, int i) {
    if (i >= str.length()) {
        return;
    }
    System.out.print(str.charAt(str.length() - i++ - 1));
    printReverse(str, i);
}
1
Chris Gong 26 janv. 2019 à 21:03

Vous pouvez faire quelque chose comme ça:

public static void main(String[] args) {
   printStringInReverse("Hello", "Hello".length() - 1);
}

public static void printStringInReverse(String s, int x) {
    if (x < 0) {
        return;
    }
    System.out.print(s.charAt(x));
    printStringInReverse(s, x - 1);
}

Notez que je démarre la méthode avec if (x < 0). Il s'agit d'un "cas de base", la condition qui arrête la récursivité. Ensuite, j'imprime le caractère à l'index x, et j'appelle à nouveau la méthode, mais en décrémentant x. Cela signifie que le prochain appel imprimera le caractère avant.

En fait, cette méthode n'a pas besoin d'avoir un paramètre int:

public static void printStringInReverse(String s) {
    if (s.equals("")) {
        return;
    }
    System.out.print(s.charAt(s.length() - 1));
    printStringInReverse(s.substring(0, s.length() - 1), x);
}

La deuxième approche est plus similaire à la façon dont la récursivité est utilisée dans les langages fonctionnels comme Haskell.

La prochaine fois que l'on vous demandera d'écrire une méthode récursive, voici quelques conseils:

  • pensez au (x) cas de base. Quels sont les cas où vous n'avez pas besoin d'appeler à nouveau la méthode?
  • S'il ne s'agit pas de l'un des cas de base, effectuez une partie du travail avec une partie de l'entrée
  • Appelez la méthode elle-même et transmettez le reste de l'entrée.
  • Gardez à l'esprit que vous souhaitez que l'entrée soit réduite à l'un des cas de base.
1
Sweeper 26 janv. 2019 à 21:04