View Full Version : Ricorsione in java
diegoves
04-07-2012, 15:42
Personalmente mi vergogno a scrivere qua per un problema tipo questo, ma è da tempo che non prendo in mano java, e non riesco neanche più a risolvere un problemino simile: dato un numero r contare quante volte si presenta nel numero num tramite ricorsione.
la funzione ricorsiva che ho fatto è:
static int conteggio (int r, int num)
{
if (num%10 == r && num > 0) return 1 + conteggio (r, num/10);
else return conteggio (r, num/10);
}
che ovviamente va in stackoverflow, sapete darmi una mano?? thanks!!
wingman87
04-07-2012, 16:04
Domanda-Soluzione: Quando termina la ricorsione?
franksisca
04-07-2012, 17:11
Domanda-Soluzione: Quando termina la ricorsione?
detto in termini spiccioli, manca la condizione di uscita
diegoves
04-07-2012, 20:45
Immaginavo, ma non basta la condizione nel num>0 dato che comunque viene decrementato costantemente fino a 0? (ovvio che non basta, altrimenti nn andrebbe in overflow, però non capisco perché non sia sufficiente come condizione!!)
wizard1993
04-07-2012, 20:51
Immaginavo, ma non basta la condizione nel num>0 dato che comunque viene decrementato costantemente fino a 0? (ovvio che non basta, altrimenti nn andrebbe in overflow, però non capisco perché non sia sufficiente come condizione!!)
perchè in tal caso esegue il secondo ramo dell'if
diegoves
05-07-2012, 07:07
Ok, in versione molto scolastica risulta:
public static int conteggio (int r, int num)
* * * * * * * * * * * * {
* * * * * * * * * * * * * * * * if (num>0)
* * * * * * * * * * * * * * * * * * * * {*
* * * * * * * * * * * * * * * * * * * * * * * * if (num%10 == r) return 1 + conteggio (r, num/10);
* * * * * * * * * * * * * * * * * * * * * * * * else return conteggio (r, num/10);
* * * * * * * * * * * * * * * * * * * * }
* * * * * * * * * * * * * * * * else return 0;
* * * * * * * * * * * * }
In versione un po' ridotta?
banryu79
05-07-2012, 08:45
Puoi verificare subito la condizione di uscita, ad esempio:
public static int conteggio(int r, int num) {
if (num == 0) return 0;
else if (num%10 == r) return 1 + conteggio(r, num/10);
else return conteggio (r, num/10);
}
Un'altra soluzione che mi viene in mente è questa (ma in Java la tail recursion non porta alcun vantaggio):
public static int conteggio(int r, int num) {
return conteggio_2(r, num, 0);
}
private static int conteggio_2(int r, int num, int acc) {
if (num == 0) return acc;
else return conteggio_2(r, num/10, (num%10 == r) ? acc+1 : acc);
}
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.