Récursive de la méthode d'assistance
je ne peux pas trouver la bonne solution pour cet exercice, voici la tâche:
(Occurrences d'un caractère spécifié dans un tableau) Écrire une méthode récursive qui
trouve le nombre d'occurrences d'un caractère spécifié dans un tableau. Vous avez besoin de
définir l'une des deux méthodes suivantes. Le second est un appel récursif de la méthode d'assistance.
public static int count(char[] caractères, char ch)
public static int count(char[] caractères, char ch, int haut)
Écrire un programme de test qui invite l'utilisateur à entrer une liste de caractères dans une ligne,
et d'un personnage, et affiche le nombre d'occurrences du caractère dans la liste.
1) je peux le résoudre que si j'ajoute un autre paramètre (int index) mais comment puis-je le faire sans ajouter un autre paramètre ou à l'aide de la boucle ?
2)Pourquoi la méthode d'aide là-bas? Je ne comprends pas le but de méthodes d'aide à la récursivité.
Voici ma solution:
package occurencesinarray;
import java.util.Scanner;
public class Start {
public static void main(String[] args){
System.out.println("Enter few characters: ");
Scanner scan = new Scanner(System.in);
String s = scan.nextLine();
char[] chars = new char[s.length()];
for(int i = 0; i < s.length(); i++){
chars[i] = s.charAt(i);
}
System.out.println("Enter desired character: ");
char ch = scan.nextLine().charAt(0);
System.out.println(count(chars, ch));
}
public static int count(char[] chars, char ch){
return count(chars, ch, 0, 0);
}
public static int count(char[] chars, char ch, int high, int index){
if(index == chars.length){
return high;
}
if(chars[index] == ch){
return count(chars, ch, high + 1, index + 1);
} else{
return count(chars, ch, high, index + 1);
}
}
}
Vous devez vous connecter pour publier un commentaire.
Comme AllenKll déjà souligné, les
high
valeur devrait probablement prendre le rôle que vous avez prévu pour votreindex
. Vous avez été de compter le nombre d'événements dans lehigh
variable, mais ce comptage peut être "caché" dans la récursivité.Le but de ces "helper" méthodes pour la récursivité en général, c'est exactement cela: Ils ont souvent (au moins) un paramètre supplémentaire qui en quelque sorte décrit dans quelle mesure la récursivité a déjà procédé ou dans quelle mesure il a encore de procéder. Comme un exemple pour le dernier: Vous pouvez également utiliser la
high
variable comme un "compte à rebours", en écrivantBien sûr, on ne peut offrir que la méthode d'assistance. Au lieu d'appeler
vous pourriez demander à l'utilisateur d'appeler
Mais le problème, c'est que cette méthode peut être utilisée à mauvais escient: Lorsque l'utilisateur passe d'une valeur erronée que le dernier paramètre, la méthode ne fonctionnera pas.
Remarque: l'ensemble de Ce "helper" chose n'a de sens que lorsque la méthode d'assistance est privé. Quand il est
public
, l'utilisateur peut toujours appeler la méthode incorrecte. Je vois que lepublic
modificateur a été demandé dans la description de la tâche, mais... peut-être que vous allez recevoir certains points bonus lorsque vous effectuez votre instructeur au courant de cette faille 😉Comment à ce sujet:
haut représente l'indice
L'aide de la méthode est donc l'appelant n'a pas besoin de savoir à propos de la "haute" paramètre. Dans une autre langue, comme C le cas, vous pouvez avoir des paramètres par défaut, il ne serait pas nécessaire.
Tout d'abord, votre assistant (récursif) méthode doit être
private
, paspublic
. Il nécessite la connaissance de la façon dont il fonctionne pour être en mesure d'appeler correctement. Cela va à l'encontre de la bonne conception de logiciel, qui dit que la mise en œuvre n'est pas important, tant que son contrat est obéi.La première méthode est la face publique de la façade qui met en place les conditions initiales (paramètres) de la méthode récursive. L'action réelle est dans la méthode récursive.
Récursive (helper) méthodes ont généralement trois choses qui doivent être déterminées (et codé):
L'état initial est généralement géré par une façade de la méthode, comme dans votre cas.
L'état final est généralement la première ligne de code dans la méthode, et provoque un retour immédiat (qui est aussi le cas pour votre cas)
Si la condition d'arrêt n'est pas atteint, l'état (et/ou de calcul) peuvent être enregistrées localement afin de contribuer à la valeur de retour, la méthode s'appelle elle-même à l'aide de paramètres que l'avance de l'état à la position suivante. Le résultat de l'auto-appel est renvoyé, éventuellement combinées avec les données de l'état enregistré.
Dans votre cas, vous êtes de passage le local de l'état par le biais de l'appel suivant. Ne pas le faire. Au lieu de cela, combiner c':
Et de l'appeler avec un indice de
0
pour lancer le processus.