Convertire un Intero in una Stringa in una qualsiasi Base usando la Ricorsione¶
Supponiamo di voler convertire un intero in una stringa in qualche base tra binaria e esadecimale. Per esempio, convertiamo l’intero 10 nella rappresentazione di tipo stringa decimale "10"
, oppure nella sua rappresentazione binaria "1010"
. Un approccio per effettuare la conversione può essere ricorsivo.
Consideriamo il numero 769 in base 10. Supponiamo che abbiamo una sequenza di caratteri corrispondenti alle prime 10 cifre, del tipo convString = "0123456789"
. E’ facile convertire un numero minore di 10 nella stringa equivalente controllando la sequenza. Per esempio, se il numero è 9, allora la stringa corrispondente è
convString[9]
oppure "9"
. Se possiamo separare il numero 769 in tre cifre singole, 7, 6, e 9, allora convertirlo a una stringa è semplice. Un numero minore di 10 sembra un buon caso base.
Questo ci suggerisce una sequenza di passi in cui dividere un algoritmo per risolvere il problema:
- Ridurre il numero originale in una serie di cifre.
- Convertire una cifra nella stringa corrispondente.
- Concatenare le stringhe che rappresentano le cifre per ottenere il risultato finale.
Come ottenere le unità, le decine, le centinaia? Per esempio, dal numero 769, vogliamo ottenere 9 e convertirlo nella stringa "9"
, ottenere 6 e convertirlo nella stringa "6"
, ottenere "7"
e convertirlo nella stringa 7. Per fare ciò possiamo dividere 769 per 10: il resto 9 (che è minore di 10) può essere convertito a stringa, il risultato della divisione 76 ci è utile per proseguire la risoluzione. Infatti, con 76 dobbiamo fare la stessa cosa, dividiamo per 10, ottenendo resto 6, che può essere convertito direttamente, e 7 come risultato. In questo caso possiamo interrompere le iterazioni in quanto anche 7 può essere convertito direttamente. Quindi dalla conversione di 769 ci siamo ricondotti alla conversione di 76, e poi alla conversione di 7, come mostrato in Figure 3.
Notiamo che alla linea 3, controlliamo se siamo in un caso base, ovvero che n
è minore della base in cui stiamo convertendo. Quando siamo in un caso base, fermiamo la ricorsione e ritorniamo semplicemente la stringa ottenuta dalla sequenza
convertString
. Alla riga 6 facciamo la chiamata ricorsiva, dove l’input della chiamata ha una taglia più piccola del problema corrente.
Questa invece è l’esecuzione se vogliamo convertire 10 nella stringa che lo rappresenta in base 2 ("1010"
).
Figura 4 mostra che otteniamo il risultato che ci aspettiamo, ma sembra che le cifre siano nell’ordine sbagliato. Abbiamo risolto il problema ritardando la concatenazione finché la chiamata ricorsiva interna è ritorna, in modo da ottenere il risultato nell’ordine corretto.
Self Check
Scrivere una funzione che prende una stringa come parametro e ritorna una nuova stringa che è l’inversa della stringa di partenza (ovvero i caratteri compaiono nell’ordine inverso).
Scrivere una funzione che prende in input una stringa e ritorna True se la stringa è palindroma, False altrimenti. Una stringa è palindroma se si legge allo stesso modo leggendola da sinistra o da destra. Per esempio: radar è palindroma. Ci possono anche essere frasi palindrome ma bisogna rimuovere gli spazi e la punteggiatura. Per esempio: madam i’m adam è palindroma, come pure:
- kayak
- aibohphobia
- Live not on evil
- Reviled did I live, said I, as evil I did deliver
- Go hang a salami; I’m a lasagna hog.
- Able was I ere I saw Elba
- Kanakanak – a town in Alaska
- Wassamassaw – a town in South Dakota