Come Reverse una stringa in Java utilizzando la ricorsione

โšก Riepilogo intelligente

Revinserendo una stringa in Java La ricorsione funziona rimuovendo il primo carattere, invertendo ciรฒ che rimane e aggiungendo quel primo carattere alla fine. Una stringa vuota interrompe le chiamate e svuota lo stack.

  • ๐Ÿ”˜ Caso base: Il metodo restituisce immediatamente un valore quando isEmpty() segnala che non c'รจ piรน nulla da annullare.
  • โ˜‘๏ธ Passo ricorsivo: substring(1) rimuove il primo carattere e charAt(0) lo rimette dopo il resto invertito.
  • โœ… Immutabilitร : Ogni chiamata produce un nuovo oggetto String, perchรฉ un Java Una stringa non puรฒ mai essere modificata direttamente sul posto.
  • ๐Ÿงช Trace: Guru99 diventa 99uruG dopo sette chiamate, una per ogni carattere piรน il caso base vuoto.
  • ๏ธ Opzioni piรน veloci: Sia StringBuilder.reverse() che uno scambio di due puntatori su toCharArray() vengono completati in un singolo passaggio.
  • ???? Costo: La ricorsione con substring() ha una complessitร  temporale quadratica e occupa uno stack frame per ogni carattere.

Java Programma che inverte una stringa utilizzando un metodo ricorsivo.

In questo programma esempio, invertiremo una stringa inserita da un utente.

Creeremo una funzione per invertire una stringa. Later Lo richiameremo ricorsivamente finchรฉ tutti i caratteri non saranno invertiti. La ricorsione si adatta a questo problema perchรฉ una stringa invertita รจ semplicemente la coda invertita della stringa con il primo carattere originale attaccato alla fine, che รจ lo stesso problema con un carattere in meno.

Scrivi a Java Programma per Reverse Corda

La classe seguente dichiara l'input nel metodo main(), lo passa al metodo reverseString() e stampa il risultato. Due chiamate a println() all'interno del metodo rendono visibile nella console ogni passaggio ricorsivo.

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 Produzione:

Ogni riga dell'output rappresenta una chiamata ricorsiva. La parte finale stampata su ogni riga รจ piรน corta di un carattere rispetto alla riga precedente, e l'ultima riga mostra il risultato invertito.

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

Come il ricorsivo RevOpere universali passo dopo passo

Due righe contengono l'intero metodo. Il caso base, if (myStr.isEmpty()), fornisce alla ricorsione un punto in cui fermarsi. La riga ricorsiva, return reverseString(myStr.substring(1)) + myStr.charAt(0), divide il lavoro in due: substring(1) รจ tutto ciรฒ che segue il primo carattere e charAt(0) รจ quel primo carattere, aggiunto dopo il resto invertito.

Tracl'input GuruIl numero 99 chiarisce l'ordine. Java invia un frame per ogni chiamata prima che avvenga qualsiasi concatenazione:

BandomyStrPassato alla chiamata successivaEspressione in attesa di terminare
1Guru99uru99reverseString(โ€œuru99โ€) + G
2uru99ru99reverseString("ru99") + u
3ru99u99reverseString(โ€œu99โ€) + r
4u9999reverseString("99") + u
5999reverseString(โ€œ9โ€) + 9
69(Vuoto)reverseString(โ€œโ€) + 9
7(Vuoto)caso base raggiuntorestituisce la stringa vuota

Lo stack si srotola quindi dal basso verso l'alto e ogni frame aggiunge il suo carattere salvato: la stringa vuota diventa 9, poi 99, poi 99u, 99ur, 99uru e infine 99uruG. Perchรฉ Java Le stringhe sono immutabili, nessuno di questi valori intermedi sovrascrive quello precedente: ogni concatenazione alloca un nuovo oggetto String.

Due dettagli nell'output della console meritano di essere menzionati. La sesta riga termina senza nulla dopo i due punti, perchรฉ la funzione substring(1) su una stringa di un solo carattere restituisce la stringa vuota anzichรฉ null. Il messaggio che segue nel programma originale recita "String in now Empty"; la formulazione รจ un errore di battitura per "String is now empty" ed รจ stata lasciata invariata in modo che il codice e l'output sopra riportato corrispondano ancora riga per riga.

Altri modi per Reverse una stringa in Java

La ricorsione รจ il modo piรน chiaro per vedere L'inversione puรฒ avvenire, ma raramente avviene nel modo in cui il codice di produzione la gestisce. Tre alternative coprono quasi tutti i casi reali.

1. StringBuilder.reverse() รจ la piรน breve e la piรน veloce. La classe include un metodo reverse() integrato, quindi l'intera operazione sta in una sola riga:

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

2. Un ciclo for con charAt() Percorre la stringa a ritroso dall'ultimo indice fino a zero. I selezionatori spesso richiedono questa versione perchรฉ mostra la logica invece di delegarla:

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

3. Uno scambio di due puntatori su toCharArray() converte la stringa in un array di caratteri, quindi scambia i caratteri piรน esterni con quelli piรน interni finchรฉ i puntatori non si incontrano al centro:

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

La stessa tecnica di array inverte una sequenza numerica o qualsiasi altra collezione ordinata, motivo per cui compare in Java schieramento esercizi con la stessa frequenza di quelli con la corda.

Complessitร  temporale e spaziale di ciascun approccio.

Le quattro versioni non hanno lo stesso costo. Entrambe le voci quadratiche qui sotto hanno una causa comune: creano una stringa completamente nuova a ogni passaggio, e copiare n caratteri n volte richiede un lavoro pari a n al quadrato.

ApproccioOraSpazio extraPerchรฉ
Ricorsione con substring()O(nยฒ)O(nยฒ)La funzione substring() copia i caratteri rimanenti ad ogni chiamata e per ogni carattere viene mantenuto un frame dello stack.
ciclo for con charAt() e +O(nยฒ)O(nยฒ)Ogni concatenazione alloca una nuova stringa e copia tutto ciรฒ che รจ stato raccolto finora
StringBuilder.reverse()O (n)O (n)Un buffer modificabile, un passaggio e le coppie surrogate rimangono intatte
Due puntatori a toCharArray()O (n)O (n)Una copia dell'array, poi n/2 scambi senza ulteriore allocazione

Scegli la versione ricorsiva per imparare o per dimostrare come si comporta lo stack di chiamate, la versione con array di caratteri quando un intervistatore chiede la logica a mano e StringBuilder.reverse() in qualsiasi versione distribuita. Lo stesso compromesso tra una soluzione didattica e una di produzione si presenta in tutti gli esercizi classici, da ordinamento a bolle e Serie di Fibonacci a controlli dei numeri primi; vale la pena praticare ciascuno di essi Java in entrambi i sensi.

DOMANDE FREQUENTI

Gli oggetti String sono immutabili, quindi i caratteri al loro interno non possono mai cambiare dopo la creazione. Ogni inversione, pertanto, crea un nuovo oggetto. Utilizzare StringBuilder o un array di caratteri quando i caratteri devono essere modificati senza allocare una nuova String a ogni passaggio.

La prima chiamata a isEmpty() genera una NullPointerException, perchรฉ il metodo viene invocato su un valore nullo. Proteggere il punto di ingresso con un controllo di nullitร  che restituisca null o generi una IllegalArgumentException prima che inizi qualsiasi ricorsione.

Non in modo affidabile. charAt() funziona su unitร  di codice a 16 bit, quindi un carattere memorizzato come coppia surrogata viene suddiviso e il testo invertito mostra dei quadrati di sostituzione. StringBuilder.reverse() mantiene unite le coppie surrogate, il che lo rende la scelta piรน sicura per il testo Unicode.

StringBuilder, in quasi tutti i casi. Entrambi espongono lo stesso metodo reverse(), ma StringBuffer sincronizza ogni chiamata, il che comporta un calo di velocitร . Scegli StringaBuffer solo quando un buffer รจ effettivamente condiviso tra i thread.

Dividi la frase in base agli spazi bianchi con split(" "), quindi scorri l'array risultante dall'ultimo indice al primo, aggiungendo ogni parola a uno StringBuilder. I caratteri all'interno di ogni parola mantengono il loro ordine originale.

Per ogni carattere viene utilizzato un frame dello stack, quindi in genere si superano alcune migliaia di caratteri prima che si verifichi un errore StackOverflowError. Il limite esatto dipende dalla dimensione dello stack dei thread della JVM. Qualsiasi versione iterativa evita completamente il limite massimo.

Un assistente IA puรฒ leggere uno stack trace, indica un caso base mancante o irraggiungibile e spiega l'ordine in cui i frame si srotolano. Elabora inoltre test per casi limite come input vuoti, a carattere singolo e nulli. Verifica il ragionamento confrontandolo con un'esecuzione reale.

Sรฌ. Le serrature scorrevoli portatili e i catenacci a superficie possono essere usati per mettere in sicurezza una porta a scomparsa dall'esterno. Alcuni kit con catena di sicurezza consentono anche il bloccaggio esterno con chiave o manopola girevole. Secondo pilota Solitamente completa un intero metodo inverso a partire dalla sola firma, spesso offrendo prima la forma StringBuilder. Verifica il caso base e la complessitร , perchรฉ il suggerimento piรน breve non รจ sempre la versione richiesta da un esercizio.

Riassumi questo post con: