0
votes

Utilisez la récursivité pour trouver un caractère spécifique suivi d'un autre caractère spécifique dans un char []

En cherchant à renvoyer le nombre de fois dans un tableau de caractères, le char ':' est suivi du char ')' en utilisant la récursivité.

public static int countSmiles(String numbers) {
    if (numbers.length() == 0) return 0;
    if (numbers.charAt(0) == ':'&& numbers.charAt(1)==')') return 1 + countSmiles(numbers.substring(1));
    return countSmiles(numbers.substring(1));
}

Je m'attends à ce que la sortie soit 2.

J'ai pu le faire avec succès en utilisant une chaîne (voir ci-dessous) mais je n'ai pas pu le faire avec le tableau char.

public class Recursion {
public static int countSmiles(char[] numbers) {
        if (numbers.length == 0) return 0;
        if(String.valueOf(numbers[0])== ":" && String.valueOf(numbers[1])==")") return 1 + countSmiles(numbers[1]);
        return countSmiles(numbers[1]);
    }
public static void main (String[] args) {
        char[] s = {'n','g', ':' ,')', ':' ,')'};
        System.out.println(countSmiles(s));
    }
}


0 commentaires

4 Réponses :


0
votes

nombres [1] vous donnera le deuxième caractère et le compilateur vous dira que l'argument n'est pas correct, car un chars [] est attendu et vous venez de donner il char . Vous devez créer un sous-tableau Arrays.copyOfRange et le passer dans countSmiles

return countSmiles(Arrays.copyOfRange(numbers, 1, numbers.length - 1));

Cependant, pour plus d'éléments, vous devrez garder le compteur du nombre d'éléments que vous avez ignorés jusqu'à présent et l'utiliser au lieu de 1.


0 commentaires

0
votes

nombres [1] est juste un seul caractère et non le tableau entier sans le premier caractère. Pour cela, vous pouvez utiliser Arrays.copyOfRange (numbers, 1, numbers.length) .


0 commentaires

2
votes

En plus de ce que les gens ont dit à propos de Arrays.copyOfRange () , vous devez également faire l'égalité avec String.equals () au lieu de == code>.

Code de travail:

import java.util.Arrays;

public class Main {
  public static int countSmiles(char[] numbers) {
        if (numbers.length == 0) return 0;
        if(String.valueOf(numbers[0]).equals(":") && String.valueOf(numbers[1]).equals(")")) {
            return 1 + countSmiles(Arrays.copyOfRange(numbers, 1, numbers.length));
        }

        return countSmiles(Arrays.copyOfRange(numbers, 1, numbers.length));
    }
  public static void main (String[] args) {
        char[] s = {'n','g', ':' ,')', ':' ,')'};
        System.out.println(countSmiles(s));
    }
}


0 commentaires

0
votes

Premièrement, votre récursion ne bouge jamais.

  • Comment êtes-vous censé scanner tout ce tableau sans pointeur?
  • Vous ne comparez jamais les chaînes avec == en java utilisez equals
  • Deuxièmement, vous pouvez comparer les caractères sans transtyper à nouveau en chaîne

public static int countSmiles (char [] numbers, int index) {

       public static void main (String[] args) {
            char[] s = {'n','g', ':' ,')', ':' ,')','r','5'};
            System.out.println(countSmiles(s,0));
        }

} // Classe principale

if ( numbers.length-2 < index) return 0;

if(numbers[index]==':' && numbers[index+1]==')')
return 1 + countSmiles(numbers,index+1);

return countSmiles(numbers,index+1);

Essayez avec ceci et il fonctionnera.


0 commentaires