Conta cifre dispari di un numero [METODO RICORSIVO]

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Sevenis
Prode Principiante
Messaggi: 79
Iscrizione: sabato 2 settembre 2006, 21:59

Conta cifre dispari di un numero [METODO RICORSIVO]

Messaggio da Sevenis »

Ciao a tutti,
dovrei fare un metodo ricorsivo che conti il numero di cifre dispare.
Ho abbozzato il codice ma non capisco come gestire la ricorsione.
Nello specifico:
- genera un loop infinito
- ogni volta che richiama il metodo mi re-inizializza la variabile somma (inizializzata all'interno del metodo) e quindi la somma mi risulta uguale a 0;

Avevo posto un ciclo while (numero>0) ma il loop continuava ugualmente.
Come posso fare?
Grazie

Codice: Seleziona tutto

import java.util.Scanner;


public class RecursionDemo {
    
public static void contaDispari(int numero){
    Scanner tastiera = new Scanner(System.in);
    int somma=0;
    int ultimacifra;
    
   
        ultimacifra = numero%10;
        System.out.println(ultimacifra);
        
        {
            if((ultimacifra%2)!=0)
            {
                somma++;
            }
            
            //contaDispari(numero/10);
            
        }
        
     
    System.out.println("La somma è: " + somma);
    }
    
    
    


    public static void main(String[] args) {
        // TODO Auto-generated method stub
        
        int numero=0;
        
        Scanner tastiera = new Scanner(System.in); 
        
        System.out.println("Inserisci un numero");
        numero = tastiera.nextInt();
        
        
        contaDispari(numero);
    }


}


Avatar utente
nuzzopippo
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1627
Iscrizione: giovedì 12 ottobre 2006, 11:34

Re: Conta cifre dispari di un numero [METODO RICORSIVO]

Messaggio da nuzzopippo »

Eccoti un esempio di metodo ricorsivo basato sul Tuo codice :

Codice: Seleziona tutto

import java.util.Scanner;

public class RecursioneDemo {
   
	public static int contaDispari() {
		Scanner tastiera = new Scanner(System.in);
		int numero = 0;
		int ultimacifra = 0;
		int somma = 0;
		try {		
		    System.out.println("Inserisci un numero");
		    numero = tastiera.nextInt();
        } catch (Exception e) {
        	return 0;
        }
    	ultimacifra = numero % 2;
		System.out.println(" - " + numero + " - " + ultimacifra);
    	if (ultimacifra != 0) {
    		somma++;
    	}
    	somma += contaDispari();
    	return somma;
	}
   
	public static void main(String[] args) {

		int totDispari = contaDispari();
		System.out.println("Totale numeri dispari inseriti " + totDispari);
	}

}
Noterai come viene sfruttata la gestione delle eccezioni per interrompere il ciclo di richiamo della funzione "contaDispari()", basta inserire un "non numero" per generare una eccezione e chiudere il programma.
È importante, nel rendere ricorsiva la funzione, analizzarsi bene i passi da tenere perché ciò si verifichi, nel Tuo codice si individuava difficoltà in tal senso, perciò Ti ho postato il codice, analizzalo per capire i passi e, in futuro, pianifica l'approccio logico da tenersi con carta e penna prima di codificare, Ti aiuterà :)
Fatti non foste a viver come bruti ...
Avatar utente
crap0101
Rampante Reduce
Rampante Reduce
Messaggi: 8242
Iscrizione: martedì 30 ottobre 2007, 6:33
Desktop: LXDE
Distribuzione: Ubuntu 18.04.1 LTS
Sesso: Maschile
Località: TO
Contatti:

Re: Conta cifre dispari di un numero [METODO RICORSIVO]

Messaggio da crap0101 »

vuole contare quante sono le cifre dispari che compongono un numero, non quanti numeri dispari inserisce.
http://www.gnu.org/ http://boinc.berkeley.edu/ http://www.python-it.org/
- Ricorda le ultime parole di suo padre: «Sta' alla larga dalle chiese, figlio. La sola cosa per cui hanno la chiave è il merdaio. E giurami che non porterai mai un distintivo della legge» - W.S. Burroughs
Avatar utente
nuzzopippo
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1627
Iscrizione: giovedì 12 ottobre 2006, 11:34

Re: Conta cifre dispari di un numero [METODO RICORSIVO]

Messaggio da nuzzopippo »

crap0101 [url=http://forum.ubuntu-it.org/viewtopic.php?p=4940158#p4940158][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:vuole contare quante sono le cifre dispari che compongono un numero, non quanti numeri dispari inserisce.
Dici? ... possibilissimo, nel caso di mia cattiva interpretazione, comunque, la logica è sempre quella, modificado opportunamente quanto proposto :

Codice: Seleziona tutto

import java.util.Scanner;


public class RecursioneDemo2 {
   
	public static int contaDispari(int numero) {
		int ultimacifra = 0;
		int somma = 0;
		try {
			String tmp = new Integer(numero).toString();
			try {
				int myNum = new Integer(tmp.substring(0,1));
				ultimacifra = myNum % 2;
				System.out.println(" - " + numero + " : " + myNum + " - " + ultimacifra);
				if (ultimacifra != 0) {
					somma++;
				}
			} catch (Exception ex) {
				System.out.println(" - " + numero + " : " + tmp.substring(0,1) + " - " + ultimacifra);
			}
			if (tmp.length() > 1) {
				tmp = tmp.substring(1);
				int restoNum = new Integer(tmp);
				somma += contaDispari(restoNum);
			}
		} catch(Exception e) {
			return 0;
		}
    	return somma;
	}
   
	public static void main(String[] args) {
		Scanner tastiera = new Scanner(System.in);
		int numero = 0;
		try {		
		    System.out.println("Inserisci un numero");
		    numero = tastiera.nextInt();
        } catch (Exception e) {
        	System.out.println("Inserito numero non valido.");
        	System.exit(0);
        }

		int totDispari = contaDispari(numero);
		System.out.println("Totale numeri dispari inseriti " + totDispari);
	}

}
In questo secondo esempio, basato su interi, è da considerare il pezzo di codice :

Codice: Seleziona tutto

			try {
				int myNum = new Integer(tmp.substring(0,1));
				ultimacifra = myNum % 2;
				System.out.println(" - " + numero + " : " + myNum + " - " + ultimacifra);
				if (ultimacifra != 0) {
					somma++;
				}
			} catch (Exception ex) {
				System.out.println(" - " + numero + " : " + tmp.substring(0,1) + " - " + ultimacifra);
			}
impostato per trattare sbrigativamente il caso del "segno", nel caso vengano inseriti interi negativi, l'output sarebbe :

Codice: Seleziona tutto

// per inserimento positivo
Inserisci un numero
12345
 - 12345 : 1 - 1
 - 2345 : 2 - 0
 - 345 : 3 - 1
 - 45 : 4 - 0
 - 5 : 5 - 1
Totale numeri dispari inseriti 3

// per inserimento negativo
Inserisci un numero
-12345
 - -12345 : - - 0
 - 12345 : 1 - 1
 - 2345 : 2 - 0
 - 345 : 3 - 1
 - 45 : 4 - 0
 - 5 : 5 - 1
Totale numeri dispari inseriti 3
[Edit] Corretto l'inserimento negatio, per sbaglio avevo inserito 2 volte l'output positivo
Fatti non foste a viver come bruti ...
Avatar utente
crap0101
Rampante Reduce
Rampante Reduce
Messaggi: 8242
Iscrizione: martedì 30 ottobre 2007, 6:33
Desktop: LXDE
Distribuzione: Ubuntu 18.04.1 LTS
Sesso: Maschile
Località: TO
Contatti:

Re: Conta cifre dispari di un numero [METODO RICORSIVO]

Messaggio da crap0101 »

un po' macchinoso, mi sembra più fluida una roba del genere

Codice: Seleziona tutto

crap0101@orange:/tmp/foo$ cat RecursioneDemo.java
public class RecursioneDemo {
    public static int contaDispari(int n) {
        if (Math.log10(n) < 1) {
            return n % 10 & 1;
        }
        return (n % 10 & 1) + contaDispari(n / 10);
    }
    public static void main(String[] args) {
        for (String arg: args) {
            int n = Math.abs(Integer.parseInt(arg));
            System.out.printf("%-10s --> %d%n", arg, contaDispari(n));
        }
   }
}
crap0101@orange:/tmp/foo$ java RecursioneDemo 1 246 456 333 -32 -3 -1 23 6798
1          --> 1
246        --> 0
456        --> 1
333        --> 3
-32        --> 1
-3         --> 1
-1         --> 1
23         --> 1
6798       --> 2
http://www.gnu.org/ http://boinc.berkeley.edu/ http://www.python-it.org/
- Ricorda le ultime parole di suo padre: «Sta' alla larga dalle chiese, figlio. La sola cosa per cui hanno la chiave è il merdaio. E giurami che non porterai mai un distintivo della legge» - W.S. Burroughs
Avatar utente
nuzzopippo
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1627
Iscrizione: giovedì 12 ottobre 2006, 11:34

Re: Conta cifre dispari di un numero [METODO RICORSIVO]

Messaggio da nuzzopippo »

Molto interessante l'uso dei logaritmi (per me sepolti sotto la polvere degli anni), certamente molto più indicati per uno studente quale @sevenis, metodo che personalmente non avrei mai pensato :giorno:
Fatti non foste a viver come bruti ...
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 12 ospiti