Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2007
    Messaggi
    115

    problema metodo ricorsivo

    Salve a tutti...la domanda è molto semplice; ho creato un metodo che riceve in ingresso un insieme di Integer e restituisce tutti i possibili sottoinsiemi...mi succede pero una cosa che non mi era mai capitata:

    se dopo aver chiamato il metodo sottoinsiemi provo a stampare l'oggetto che gli ho passato a questo metodo, l'oggetto risulta vuoto. Detto in altro parole: nel main richiamo il metodo sottoinsiemi passandogli "set2"....se poi provo a stampare set2 mi restituisce l'insieme vuoto....mentre io vorrei che l'insieme set2 rimanesse intatto...dove sbaglio??? quale accorgimento potrei usare...?? grazie in anticipo...

    codice:
    private static Set<Set<Integer>> sottoinsiemi(Set<Integer> s) {
                    if(s.isEmpty()){
                    Set<Set<Integer>> res = new HashSet<Set<Integer>>();
                    res.add(s);
                
                    return res;
                    } 
    		
    		Integer e = s.iterator().next();
    		s.remove(e);
    		Set<Set<Integer>> res = sottoinsiemi(s);
    		
    		Set<Set<Integer>> newSets = new HashSet<Set<Integer>>();
    		for (Iterator<Set<Integer>> iterator = res.iterator(); iterator.hasNext();) {
    			Set<Integer> set = iterator.next();
    			Set<Integer> newSet = new HashSet<Integer>();
    			newSet.addAll(set);
    			newSet.add(e);
    			newSets.add(newSet);
    		}
    		res.addAll(newSets);
    		return res;
    	}
    
    main: 
    
    Set<Integer> set2 = new HashSet<Integer>();
                    set2.add(1);
                    set2.add(2);
                    set2.add(3);
    
    Set<Set<Integer>> subsets = sottoinsiemi(set2);
    System.out.println("iniziale : "+set2); // vuoto ???????????????????????????????'

  2. #2
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    613

    Re: problema metodo ricorsivo

    Originariamente inviato da cobraa
    Salve a tutti...la domanda è molto semplice; ho creato un metodo che riceve in ingresso un insieme di Integer e restituisce tutti i possibili sottoinsiemi...mi succede pero una cosa che non mi era mai capitata:

    se dopo aver chiamato il metodo sottoinsiemi provo a stampare l'oggetto che gli ho passato a questo metodo, l'oggetto risulta vuoto. Detto in altro parole: nel main richiamo il metodo sottoinsiemi passandogli "set2"....se poi provo a stampare set2 mi restituisce l'insieme vuoto....mentre io vorrei che l'insieme set2 rimanesse intatto...dove sbaglio??? quale accorgimento potrei usare...?? grazie in anticipo...

    codice:
    private static Set<Set<Integer>> sottoinsiemi(Set<Integer> s) {
                    if(s.isEmpty()){
                    Set<Set<Integer>> res = new HashSet<Set<Integer>>();
                    res.add(s);
                
                    return res;
                    } 
    		
    		Integer e = s.iterator().next();
    		s.remove(e);
    		Set<Set<Integer>> res = sottoinsiemi(s);
    		
    		Set<Set<Integer>> newSets = new HashSet<Set<Integer>>();
    		for (Iterator<Set<Integer>> iterator = res.iterator(); iterator.hasNext();) {
    			Set<Integer> set = iterator.next();
    			Set<Integer> newSet = new HashSet<Integer>();
    			newSet.addAll(set);
    			newSet.add(e);
    			newSets.add(newSet);
    		}
    		res.addAll(newSets);
    		return res;
    	}
    
    main: 
    
    Set<Integer> set2 = new HashSet<Integer>();
                    set2.add(1);
                    set2.add(2);
                    set2.add(3);
    
    Set<Set<Integer>> subsets = sottoinsiemi(set2);
    System.out.println("iniziale : "+set2); // vuoto ???????????????????????????????'
    Ho provato il tuo codice e mi sembra che passando a sottoinsiemi una nuova istanza di HashMap<Integer> costruita su quella vecchia il problema si risolva, prova:

    codice:
    Set<Set<Integer>> subsets = sottoinsiemi(
        new HashSet<Integer>(set2));

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2007
    Messaggi
    115
    Come dici tu funziona...pero io gli sto passando una copia si set2...cmq si era l'idea che avevo in mente anche io..anche se volevo evitare di creare istanze inutili per ottenere quello che ho bisogno!!!..


    Sto cercando di modificare il codice in modo tale che non venga modificato set2...

    cmq grazie 1000 ...se avete altre idee.....

  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    613
    Originariamente inviato da cobraa
    Come dici tu funziona...pero io gli sto passando una copia si set2...cmq si era l'idea che avevo in mente anche io..anche se volevo evitare di creare istanze inutili per ottenere quello che ho bisogno!!!..


    Sto cercando di modificare il codice in modo tale che non venga modificato set2...

    cmq grazie 1000 ...se avete altre idee.....
    Finché il tuo metodo modifica gli elementi dell'insieme non c'è alternativa ad una nuova istanza...

  5. #5
    Originariamente inviato da cobraa
    Sto cercando di modificare il codice in modo tale che non venga modificato set2...

    cmq grazie 1000 ...se avete altre idee.....
    Potresti utilizzare un'indice, quindi aggiungendo un parametro al metodo:

    codice:
    	private static Set<Set<Integer>> sottoinsiemi(Set<Integer> s, int i){
    		if( i == s.size() ){
    			Set<Set<Integer>> res = new HashSet<Set<Integer>>();
    			res.add( new HashSet<Integer>() );
    			return res;
    		}
    		
    		Integer e = s.toArray(new Integer[0])[i];
    		Set<Set<Integer>> res = sottoinsiemi(s, i + 1);
    		
    		Set<Set<Integer>> tmp = new HashSet<Set<Integer>>();
    		for( Iterator<Set<Integer>> resIt = res.iterator(); resIt.hasNext(); ){
    			Set<Integer> newSet = new HashSet<Integer>();
    			newSet.addAll( resIt.next() );
    			newSet.add( e );
    			tmp.add(newSet);
    		}
    		res.addAll(tmp);
    		
    		return res;
    	}
    Spero ti sia utile.

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.