Visualizzazione dei risultati da 1 a 9 su 9

Discussione: metodo ricorsivo

  1. #1
    Utente di HTML.it
    Registrato dal
    May 2011
    Messaggi
    108

    metodo ricorsivo

    Ragazzi, mi sto sbattendo la testa per stampare questo metodo ricorsivo.
    Devo realizzare la sequenza di Kaprekar.
    il metodo che definisce ogni numero è questo:
    [CODE]
    public static int next(int n){

    String s = Integer.toString(n);
    String s1 = "", s2 = "";
    String[] array = new String[s.length()];
    for(int i=0;i<array.length;i++){
    char c = s.charAt(i);
    array[i] = Character.toString(c);
    }
    Arrays.sort(array);
    for(int i=0;i<array.length;i++){
    s1 = s1.concat(array[i]);
    }
    for(int i=array.length-1;i>=0;i--){
    s2 = s2.concat(array[i]);
    }
    int a = Integer.parseInt(s1);
    int b = Integer.parseInt(s2);
    int ris = b-a;

    return ris;
    }
    /CODE]
    anche se è un pò contorto però funziona.
    Adesso devo fare il metodo stampaSequenza(int n).
    la stampa deve terminare quando next(n) = next(i). cioè mi spiego meglio:
    La sequenza di Kaprekar dice questo:
    prendo un numero, tipo 86
    da questo creo due interi a e b, a = 68 e b = 86...cioè a è composto dalle cifre del numero in ordine crescente e b in ordine decrescente
    poi faccio b-a, che in questo caso è 18 e vado avanti così prendendo 18 come numero iniziale...
    la sequenza finisce quando next(n) = n...in questo caso è next(0) = 0.
    Spero di essermi spiegato bene.
    Come faccio a stampare la sequenza?

  2. #2

    Re: metodo ricorsivo

    Originariamente inviato da GianniMal
    anche se è un pò contorto però funziona.
    Ti conviene migliorarla un po'..
    Originariamente inviato da GianniMal
    Adesso devo fare il metodo stampaSequenza(int n).
    Ad esempio, potresti fare:
    codice:
        public static List<Integer> getSequence(int n){
        	return this.getSequence(n, new ArrayList<Integer>());
        }
        
        private static List<Integer> getSequence(int n, List<Integer> sequence){
        	if( n == 0 )
        		return sequence;
        	sequence.add(n);
        	return getSequence(next(n), sequence);
        }

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2011
    Messaggi
    108
    Ho aggiunto i tuoi metodi e poi il metodo stamapaCelle(n) è diventato così:
    codice:
    public static void stampaSequenza(int n){
    	List<Integer> i = getSequence(n);
    	for(Integer x : i)
    		System.out.println(x);
    }
    funziona bene grazie però...
    non ho capito benissimo come funzionano cmq non ci sarei mai arrivato ad implementarli.
    Cioè non vedo diciamo la ricorsione del metodo next(n).

  4. #4
    Originariamente inviato da GianniMal
    non ho capito benissimo come funzionano cmq non ci sarei mai arrivato ad implementarli.
    Cioè non vedo diciamo la ricorsione del metodo next(n).
    Il metodo ricorsivo è getSequence(int n, List<Integer> sequence) che utilizza il metodo next(int n).

    Prova ad implementare la funzione ricorsiva senza utilizzare next(int n).

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2011
    Messaggi
    108
    Non funziona bene il metodo next(n) perchè con dei numeri mi da il seguente errore
    codice:
    Exception in thread "main" java.lang.StackOverflowError
    	at java.lang.Character.digit(Unknown Source)
    	at java.lang.Character.digit(Unknown Source)
    	at java.lang.Integer.parseInt(Unknown Source)
    	at java.lang.Integer.parseInt(Unknown Source)
    	at Kaprekar.next(Kaprekar.java:21)
    	at Kaprekar.getSequence(Kaprekar.java:37)
            // ripetuto tante volte
    riporto tutta la classe
    codice:
    public class Kaprekar {
    
    	public static int next(int n){
    		
    		String s = Integer.toString(n);
    		String s1 = "", s2 = "";
    		String[] array = new String[s.length()];
    		for(int i=0;i<array.length;i++){
    			char c = s.charAt(i);
    			array[i] = Character.toString(c);
    		}
    		Arrays.sort(array);
    		for(int i=0;i<array.length;i++){
    			s1 = s1.concat(array[i]);
    		}
    		for(int i=array.length-1;i>=0;i--){
    			s2 = s2.concat(array[i]);
    		}
    21)		int a = Integer.parseInt(s1);
    		int b = Integer.parseInt(s2);
    		int ris = b-a;
    		
    		return ris;
    	}
    		
    	public static List<Integer> getSequence(int n){
    	   	List<Integer> sequence = new ArrayList<Integer>();
    37)	   	return getSequence(n, sequence);
    	}
    	    
    	private static List<Integer> getSequence(int n, List<Integer> sequence){
    	   	if( n == 0 )
    	   		return sequence;
    	   	sequence.add(n);
    	   	return getSequence(next(n), sequence);
    	}
    	
    	public static void stampaSequenza(int n){
    		List<Integer> i = getSequence(n);
    		for(Integer x : i)
    			System.out.println(x);
    	}			
    	
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		Scanner in = new Scanner(System.in);
    		System.out.print("Numero: ");
    		int n = in.nextInt();
    
    		stampaSequenza(n);
    	}
    
    }
    dove stampare tipo in questo modo
    Numero : 86

    86 18 63 27 45 9 0

    Numero : 678

    678 198 792 693 594 495

  6. #6
    Originariamente inviato da GianniMal
    Non funziona bene il metodo next(n) perchè con dei numeri mi da il seguente errore
    Il problema viene generato in:
    codice:
    Integer.parseInt();
    Poi, perchè utilizzi un array di stringhe e lo ordini?

    EDIT:
    La documentazione ufficiale, riferendosi allo StackOverflowError, dice:
    Thrown when a stack overflow occurs because an application recurses too deeply.

  7. #7
    Utente di HTML.it
    Registrato dal
    May 2011
    Messaggi
    108
    Ho implementato il metodo next(n) pensando in questo modo:
    per prendere ogni singola cifra del numero n uso il charAt()
    per ordinare i numeri uso Array.sort(array)
    per creare a e b leggo e concateno ogni elemento dell'array ordinato
    trasformo le due concatenazioni in interi
    faccio la sottrazione

    Ho fatto tutto questo giro perchè non mi è venuto in mente qualcosa di più "leggero", è dato dal fatto che nn riuscivo a capire come leggere ogni singola cifra.

    Ho provato con gli stessi numeri che mi dava l'errore e utilizzando da solo il metodo next(n) funziona bene.
    codice:
    public static void main(String[] args) {
    	
    	Scanner in = new Scanner(System.in);
    	System.out.print("Numero: ");
    	int n = in.nextInt();
    		
    	System.out.println(n);
    	System.out.println(next(n));
    	System.out.println(next(next(n)));
    	System.out.println(next(next(next(n))));
    	System.out.println(next(next(next(next(n)))));
    	System.out.println(next(next(next(next(next(n))))));
    }
    anche se non è il massimo era giusto per provare se il metodo funziona ed infatti mi stampa questo
    codice:
    Numero : 678
    
    678 198 792 693 594 495

  8. #8
    Mi sono andato a leggere la definizione di sequenza di Kaprekar e ho avuto modo di vedere che
    la condizione di stop non è next(n) = 0, bensì next(n) = n.

    Quindi, sistema i metodi interessati in questo modo:
    codice:
        public static List<Integer> getSequence(int n) {
        	List<Integer> sequence = new ArrayList<Integer>();
        	sequence.add(n);
        	return getSequence(n, sequence);
        }
        
        private static List<Integer> getSequence(int n, List<Integer> sequence) {
        	int next = next(n);
        	if( n == next )
        	    return sequence;
        	sequence.add(next);
        	return getSequence(next, sequence);
        }
    e non avrai più l'errore.

  9. #9
    Utente di HTML.it
    Registrato dal
    May 2011
    Messaggi
    108
    ok ok grazie mille come sempre

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.