View Full Version : [JAVA] Algoritmo ricorsivo inversione cifre
Merlino86
16-01-2009, 19:26
Salve a tutti sono alle prese con questo semplice algoritmo ma alquanto fastidioso...il mio obiettivo è invertire un numero es.: input 12345 -output 54321... sono riuscito a fare ciò solo trasformando le cifre in stringhe per poi concatenarle...vi posto la mia soluzione:
public static int inversioneR(int x)
{
String numero = "";
if(x<10) return x ;
else
{
int inverso = x % 10;
numero += inverso;
int newX = x / 10;
return Integer.parseInt(numero + inversioneR(newX));
}
Non riesco a trovare invece la soluzione la quale non comporti la trasformazione delle cifre in lettere ...se qualcuno fosse così gentile da perdere qualche minuto per aiutarmi gliene sarei grato...grazie in anticipo :)
Don[ITA]
16-01-2009, 20:30
Beh ma credo non cambierebbe nulla trasformandole in lettere :mbe:
Alla fine ti troveresti un array di char invece che una stringa (che è per l'appunto un array di char). Ho forse capito male quello che vuoi fare?
Merlino86
16-01-2009, 21:24
;25879681']Beh ma credo non cambierebbe nulla trasformandole in lettere :mbe:
Alla fine ti troveresti un array di char invece che una stringa (che è per l'appunto un array di char). Ho forse capito male quello che vuoi fare?
Praticamete io ho già trovato la soluzione per invertire il numero ma questo comporta la trasformazione della cifra in un carattere per poterla concatenare (attraverso l'operatore "+" ) alla prossima cifra sempre trasformata in carattere...invece vorrei riuscire a invertire il numero senza ricorrere alla trasformazione di ogni singola cifra in carattere..mi sono riuscito a spiegare bene questa volta?... ;)
Puoi aiutarti pensando che quando concateni ad un numero una cifra quello che ottieni è questo:
Numero.Cifra -> Numero*10+Cifra
Merlino86
18-01-2009, 11:46
Puoi aiutarti pensando che quando concateni ad un numero una cifra quello che ottieni è questo:
Numero.Cifra -> Numero*10+Cifra
Si infatti questa è la regola base per concatenare le cifre...ma nella ricorsione la quale inizia a stampare dall'ultimo valore preso in esame bisognerebbe trovare una soluzione per isolare la prima cifra del numero e concatenarla alle successive ricorsivamente ....in questo modo otterremmo come prima stampa l'ultima cifra del numero , come seconda la penultima cifra e così via.... credo ke la soluzione sia questa ma nn riesco ancora a isolare la prima cifra del numero....:(
Non riesci a trovarlo perché pensi a fare la ricorsione solo in fondo...se la fai all'inizio cosa succede ? ;)
Merlino86
18-01-2009, 13:03
Non riesci a trovarlo perché pensi a fare la ricorsione solo in fondo...se la fai all'inizio cosa succede ? ;)
grazie per il suggerimento ma sinceramente ho le idee ancora più confuse.. mi dispiace :( .... forse ho bisogno di capire ancora meglio la ricorsione....
clockover
18-01-2009, 20:28
Fatti un disegnino ad alberello di come lavora l'algoritmo!
Si comincia dal caso base (non sempre ovviamente), cioè quando l'algoritmo deve fermarsi! Quando si ferma comincia dall'alto della pila (stack) a far proseguire l'algoritmo che ha richiamato l'ultima volta la ricorsione! In questo modo l'elemento letto all'ultimo, sarà il primo ad essere elaborato!
ti faccio un esempio
public static void leggiArr(int a[]){
leggiArr(a, 0);
}
public static void leggiArr(int a[], int i){
if(i == a.length)return;
System.out.print(a[i]+" ");
leggiArr(a, i + 1);
}
nel secondo metodo dovresti saper riconoscere la ricorsione, e l'elaborazione degli elementi, in questo caso con la stampa a video! Per il tuo metodo devi apportare una piccola variazione!
Ciao
Merlino86
20-01-2009, 09:46
grazie a tutti per esservi interessati al mio problema...."ho trovato" la soluzione.... :D
Merlino86
20-01-2009, 10:43
Rendici partecipi ;)
certo con molto piacere....:D
allora essenzialmente "l'unica" soluzione è questa:
Passo base: portarsi dietro come parametro esplicito della chiamata ricorsiva una variabile che potesse sommare l'ultima cifra del numero moltiplicata per 10 alla penultima e così via fino alla prima.
quindi il codice sarebbe questo
public static int inversioneR(int numero, int inverso)
{
int resto = numero % 10;
if(numero > 10)
{
int newNumero = numero / 10;
inverso = (inverso + resto) * 10;
return inversioneR(newNumero,inverso);
}
else
return inverso + resto;
}
Ovviamente la chiamata a questo metodo sarebbe :
inversioneR( numeroDaInvertire , 0 )
Vi ringrazio ancora per i vostri suggerimenti ;)
Bene.
Però si sarebbe potuto fare anche con un solo parametro sfruttando alcun proprietà matematiche.
PS: sia chiaro, non è più veloce di come l'hai fatto te
Merlino86
20-01-2009, 11:21
Bene.
Però si sarebbe potuto fare anche con un solo parametro sfruttando alcun proprietà matematiche.
PS: sia chiaro, non è più veloce di come l'hai fatto te
era quello che volevo ottenere come soluzione ma sinceramente non sono riuscito a trovare la sequenza di calcoli matematici esatta....
Pensa a logaritmo in base 10 ed elevazione a potenza di 10 ;)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.