Comment Reverse une chaîne de caractères dans Java en utilisant la récursivité

⚡ Résumé intelligent

Reversing a string in Java La récursivité fonctionne en retirant le premier caractère, en inversant le reste, puis en ajoutant ce premier caractère à la fin. Une chaîne vide interrompt les appels et dépile la pile.

  • (I.e. Cas de base: La méthode renvoie immédiatement lorsque isEmpty() indique qu'il ne reste plus rien à inverser.
  • ☑️ Étape récursive : substring(1) supprime le premier caractère et charAt(0) le remet après le reste inversé.
  • Immutabilité: Chaque appel produit un nouvel objet String, car un Java Il est impossible de modifier une chaîne de caractères directement sur place.
  • 🧪 Trace: Guru99 devient 99uruG après sept appels, un pour chaque caractère plus le cas de base vide.
  • Options plus rapides : StringBuilder.reverse() et un échange de deux pointeurs via toCharArray() s'effectuent tous deux en une seule passe.
  • 📌 Coût : La récursion avec substring() s'exécute en temps quadratique et occupe une trame de pile par caractère.

Java programme qui inverse une chaîne de caractères à l'aide d'une méthode récursive

Dans cet exemple de programme, nous inverserons une chaîne saisie par un utilisateur.

Nous allons créer une fonction pour inverser une chaîne. Later Nous procéderons par récursivité jusqu'à ce que tous les caractères soient inversés. La récursivité convient à ce problème car une chaîne inversée est simplement la fin de la chaîne inversée, le premier caractère original étant ajouté à la fin ; il s'agit du même problème, mais avec un caractère de moins.

Rediger un Java Programme à Reverse Chaîne

La classe ci-dessous déclare l'entrée dans la fonction main(), la transmet à reverseString() et affiche le résultat. Deux appels à println() à l'intérieur de la méthode permettent de visualiser chaque étape récursive dans la console.

package com.guru99;
 
public class ReverseString {
 
	public static void main(String[] args) {
 
 
		String myStr = "Guru99";
 
 
		//create Method and pass and input parameter string 
		String reversed = reverseString(myStr);
		System.out.println("The reversed string is: " + reversed);
		
	}
 
 
	//Method take string parameter and check string is empty or not
	public static String reverseString(String myStr)
	{
		if (myStr.isEmpty()){
		 System.out.println("String in now Empty");	
		 return myStr;
		}
		//Calling Function Recursively
		System.out.println("String to be passed in Recursive Function: "+myStr.substring(1));
		return reverseString(myStr.substring(1)) + myStr.charAt(0);
	}
 
}

Code Sortie :

Chaque ligne du résultat correspond à un appel récursif. La fin de chaque ligne est plus courte d'un caractère que la ligne précédente, et la dernière ligne affiche le résultat inversé.

String to be passed in Recursive Function: uru99
String to be passed in Recursive Function: ru99
String to be passed in Recursive Function: u99
String to be passed in Recursive Function: 99
String to be passed in Recursive Function: 9
String to be passed in Recursive Function: 
String in now Empty
The reversed string is: 99uruG

Comment la récursivité Reversal fonctionne étape par étape

La méthode complète se compose de deux lignes. Le cas de base, `if (myStr.isEmpty())`, indique à la récursion où s'arrêter. La ligne récursive, `return reverseString(myStr.substring(1)) + myStr.charAt(0)`, divise le travail en deux : `substring(1)` représente tout ce qui suit le premier caractère, et `charAt(0)` représente ce premier caractère, ajouté à la fin. après le reste inversé.

Tracl'entrée Guru99 clarifie l'ordre. Java insère une image pour chaque appel avant toute concaténation :

AppelermyStrPassé à l'appel suivantExpression en attente de fin
1Guru99uru99reverseString(“uru99”) + G
2uru99ru99reverseString(“ru99”) + u
3ru99u99reverseString(“u99”) + r
4u9999reverseString("99") + u
5999reverseString(“9”) + 9
69(Vide)reverseString(“”) + 9
7(Vide)scénario de base atteintrenvoie la chaîne vide

La pile se déroule ensuite de bas en haut, et chaque image ajoute son caractère sauvegardé : la chaîne vide devient 9, puis 99, puis 99u, 99ur, 99uru, et enfin… 99uruG. Car Java Les chaînes de caractères sont immuables, aucune de ces valeurs intermédiaires ne remplace la précédente — chaque concaténation alloue un nouvel objet String.

Deux détails de la sortie console méritent d'être soulignés. La sixième ligne ne contient rien après les deux-points, car la fonction `substring(1)` appliquée à une chaîne d'un seul caractère renvoie la chaîne vide et non `null`. Le message suivant, « String in now Empty » dans le programme original, est une faute de frappe : il s'agit de « String is now empty ». Cette formulation a été conservée afin que le code et la sortie ci-dessus correspondent parfaitement.

Autres façons de Reverse une chaîne de caractères dans Java

La récursivité est la méthode la plus claire pour sur le lien L'inversion peut se produire, mais rarement de la manière dont le code en production se comporte. Trois alternatives couvrent la quasi-totalité des cas réels.

1. StringBuilder.reverse() C'est la plus courte et la plus rapide. La classe possède une méthode reverse() intégrée, ce qui permet d'effectuer l'opération complète en une seule ligne :

String reversed = new StringBuilder(myStr).reverse().toString();

2. Une boucle for avec charAt() parcourt la chaîne à rebours, du dernier indice jusqu'à zéro. Les recruteurs demandent souvent cette version car elle illustre la logique au lieu de la déléguer :

String reversed = "";
for (int i = myStr.length() - 1; i >= 0; i--) {
    reversed = reversed + myStr.charAt(i);
}

3. Un échange de deux pointeurs sur toCharArray() convertit la chaîne en un tableau de caractères, puis échange les caractères les plus extérieurs vers l'intérieur jusqu'à ce que les pointeurs se rejoignent au milieu :

char[] chars = myStr.toCharArray();
int left = 0;
int right = chars.length - 1;
while (left < right) {
    char temp = chars[left];
    chars[left] = chars[right];
    chars[right] = temp;
    left++;
    right--;
}
String reversed = new String(chars);

Cette même technique de manipulation de tableaux inverse une séquence numérique ou toute autre collection ordonnée, ce qui explique sa présence dans… Java tableau des exercices aussi souvent que dans les cordes.

Complexité temporelle et spatiale de chaque approche

Les quatre versions n'ont pas le même coût. Les deux équations quadratiques ci-dessous ont une cause commune : elles créent une nouvelle chaîne de caractères à chaque étape, et copier n caractères n fois représente un travail de complexité n².

ApprocheHeureEspace supplémentairePourquoi
Récursion avec sous-chaîne()O(n²)O(n²)La fonction substring() copie les caractères restants à chaque appel, et une trame de pile est conservée par caractère.
boucle for avec charAt() et +O(n²)O(n²)Chaque concaténation alloue une nouvelle chaîne de caractères et copie tout ce qui a été collecté jusqu'à présent.
StringBuilder.reverse()O (n)O (n)Un tampon modifiable, un passage, et les paires de substitution sont conservées intactes
Deux pointeurs sur toCharArray()O (n)O (n)Une copie du tableau, puis n/2 échanges sans allocation supplémentaire.

Choisissez la version récursive pour apprendre ou démontrer le comportement de la pile d'appels, la version avec tableau de caractères lorsqu'un recruteur vous demande la logique détaillée, et `StringBuilder.reverse()` dans tout produit distribué. Ce même compromis entre une solution pédagogique et une solution de production se retrouve dans tous les exercices classiques. tri à bulles et la Série Fibonacci à vérifications de nombres premiers; chacune mérite d'être pratiquée dans Java dans les deux sens.

FAQ

Les objets String sont immuables ; leurs caractères ne peuvent donc jamais être modifiés après leur création. Chaque inversion crée par conséquent un nouvel objet. Utilisez StringBuilder ou un tableau de caractères lorsque les caractères doivent être modifiés sans avoir à allouer une nouvelle chaîne à chaque étape.

Le premier appel à `isEmpty()` lève une `NullPointerException`, car la méthode est appelée sur une valeur vide. Protégez le point d'entrée avec une vérification de valeur nulle qui renvoie `null` ou lève une `IllegalArgumentException` avant toute récursion.

Ce n'est pas toujours fiable. La fonction `charAt()` fonctionne sur des unités de code 16 bits ; par conséquent, un caractère stocké sous forme de paire de substitution est divisé et le texte inversé affiche des carrés de remplacement. La méthode `StringBuilder.reverse()` conserve les paires de substitution ensemble, ce qui en fait un choix plus sûr pour le texte Unicode.

Dans presque tous les cas, il s'agit de StringBuilder. Les deux exposent la même méthode reverse(), mais StringBuffer Synchronise chaque appel, ce qui ralentit le processus. Choisir ChaîneBuffer uniquement lorsqu'un tampon est réellement partagé entre les threads.

Divisez la phrase en fonction des espaces avec split(" "), puis parcourez le tableau résultant du dernier indice au premier, en ajoutant chaque mot à un StringBuilder. Les caractères à l'intérieur de chaque mot restent dans leur ordre d'origine.

Une trame de pile est utilisée par caractère ; il faut donc généralement attendre quelques milliers de caractères avant qu'une erreur StackOverflowError ne survienne. La limite exacte dépend de la taille de la pile du thread JVM. Toute version itérative permet d'éviter complètement cette limite.

Un assistant IA peut lire une pile trace, indiquez un cas de base manquant ou inaccessible et expliquez l'ordre de déroulement des trames. Le programme propose également des tests pour les cas limites : entrée vide, entrée contenant un seul caractère et entrée nulle. Vérifiez le raisonnement à l'aide d'un exemple d'exécution réel.

Oui. Copilot En général, la méthode inverse est entièrement déduite de la signature, et la forme StringBuilder est souvent proposée en premier. Vérifiez le cas de base et la complexité, car la suggestion la plus courte n'est pas toujours celle demandée dans un exercice.

Résumez cet article avec :