Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 19
  1. #1

    numero di cifre (metodo ricorsivo)

    [JAVA]
    Salve a tutti, mi sono iscritto poco fa perchè ho un problema con un esercizio che proprio non riesco a fare:

    (usando un metodo ricorsivo) devo restituire il numero di cifre di cui è composto un intero positivo o negativo.

    sapendo che n=SavitchIn.readLineInt(); acquisisce il numero intero e lo salva nella variabile n

    questo è quello che ho fatto:
    codice:
    class NumeroDiCifre
    {
        public static int QuanteCifre(int n,int conta)
        {   if(n>0)
            {   n=n/10;
                conta++;
                System.out.println(conta);
                QuanteCifre(n,conta);
            }
            return conta;
        }    
    
        public static void main(String[] args)
        {   int numero,numero_cifre;
            System.out.print("Inserisci il numero: ");
            numero = SavitchIn.readLineInt();
            
            if(numero<0)    //valore assoluto del numero
                numero=numero*(-1);
    
            numero_cifre = QuanteCifre(numero,0);
            System.out.println(numero+" ha "+numero_cifre+" cifre.");
        }
    }
    ma, essendo il metodo ricorsivo, il risultato è al contrario di quello che volevo, infatti da terminale risulta:
    Inserisci il numero: 1234
    1
    2
    3
    4
    1234 ha 1 cifre.
    PS: all'interno del metodo ricorsivo ho aggiunto (come debug per capire che succedeva) la stampa del valore di "conta" e la conta è corretta... come faccio a risolvere però quel problema???
    grazie in anticipo
    Ultima modifica di mastodilu; 06-01-2015 a 16:38

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da mastodilu Visualizza il messaggio
    codice:
        public static int QuanteCifre(int n,int conta)
        {   if(n>0)
            {   n=n/10;
                conta++;
                System.out.println(conta);
                QuanteCifre(n,conta);
            }
            return conta;
        }
    Sappi innanzitutto che per il metodo ricorsivo non serve che riceva quel 'conta'! È sufficiente che riceve il valore da esaminare e basta.

    Devi ragionare più in senso ricorsivo e un esempio potrebbe chiarirti:

    Invochi direttamente il metodo passando es. 6789. Dato che è maggiore di 0, restituirai 1 + quello che ti fornisce la invocazione ricorsiva. La prima invocazione ricorsiva la fai passando 678 (il valore diviso 10). In questa invocazione il valore è maggiore di 0, quindi restituirai 1 + quello che ti fornisce la invocazione ricorsiva. Ecc....
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Devi ragionare più in senso ricorsivo e un esempio potrebbe chiarirti:

    Invochi direttamente il metodo passando es. 6789. Dato che è maggiore di 0, restituirai 1 + quello che ti fornisce la invocazione ricorsiva. La prima invocazione ricorsiva la fai passando 678 (il valore diviso 10). In questa invocazione il valore è maggiore di 0, quindi restituirai 1 + quello che ti fornisce la invocazione ricorsiva. Ecc....
    ma quel ragionamento è esattamente quello che ho fatto io (credo..).
    sono riuscito a farlo con il metodo ricorsivo ma il metodo è void e non c'è alcun return, cosa che non è del tutto lecita perchè nella consegna viene specificato di restituire il valore.
    Quello che ho scritto:
    codice:
    class NumeroDiCifre
    {
        public static void QuanteCifre(int n,int i)
        {    if(n/10 != 0)
            {    n=n/10;
                i++;
                QuanteCifre(n,i);
            }else
                System.out.println("Ha "+i+" cifra/e");
        }
    
        public static void main(String[] args)
        {    int numero;
            System.out.print("Numero: ");
            numero = SavitchIn.readLineInt();        
            if(numero<0)    //valore assoluto del numero
                numero=numero*(-1);
            QuanteCifre(numero,1);
        }
    }
    non riesco a capire come fare senza passare il valore "conta"

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    No... non è esattamente quello che hai fatto.
    Il tuo metodo ricorsivo non sta sommando 1 a (quello che gli viene ritornato dalla chiamata ricorsiva)... al contrario: il valore ritornato dalla chiamata ricorsiva tu lo butti via (non lo assegni a nulla).


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    Il problema è che ti mancava un return.
    Spiego
    Supponiamo di richiamare il metodo con un numero di una cifra, entri nell' if (n > 0) aumenti conta e richiami di nuovo il tuo metodo.
    Quindi questa volta n < 0 è quindi fai il return di conta cioè 1 quindi il controllo passa di nuovo alla chiamata precedente e fa di nuovo "return conta" ora la prima chiamata era stata fatta con conta = 0 e quindi ti viene ritornato 0.
    Soluzione bè invece di richiamare il metodo diciamo in maniera "liscia" richiamalo con return QuanteCifre(); in modo da non fargli rifare il return delle chiamate precedenti.

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    .... e scusate se lo ripeto: non serve che il metodo riceva quel parametro 'conta' (o come lo vuoi chiamare) in più.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    continuo a non capire.. cosa vuol dire: "Soluzione bè invece di richiamare il metodo diciamo in maniera "liscia" richiamalo con return QuanteCifre(); in modo da non fargli rifare il return delle chiamate precedenti."?

  8. #8
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Invochi direttamente il metodo passando es. 6789. Dato che è maggiore di 0, restituirai 1 + quello che ti fornisce la invocazione ricorsiva. La prima invocazione ricorsiva la fai passando 678 (il valore diviso 10). In questa invocazione il valore è maggiore di 0, quindi restituirai 1 + quello che ti fornisce la invocazione ricorsiva. Ecc....
    facendo così mi dice "missing return statement" e se non ricordo male vuol dire che manca un else con un secondo return, quindi il mio dubbio resta, non capisco come farlo senza passare un contatore.

  9. #9
    Quote Originariamente inviata da mastodilu Visualizza il messaggio
    facendo così mi dice "missing return statement" e se non ricordo male vuol dire che manca un else con un secondo return, quindi il mio dubbio resta, non capisco come farlo senza passare un contatore.
    Infatti Io non ti ho detto di levare il return che fai in fondo ma di effettuare anche il return delle altre chiamate ricorsive....

  10. #10
    ok ma il return che avevo messo serviva a restituire "conta" che mi è stato detto essere inutile...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.