Problema esercizio albero n-ario

di il
1 risposte

Problema esercizio albero n-ario

Salve a tutti. ragazzi ho un problema con un esercizio di cui nn riesco a venirne a capo. Si tratta di un algoritmo che crea un albero n-ario di radice(int n) che gode di questa proprietà: ogni nodo figlio deve essere un divisore del nodo genitore diverso da 1 e diverso dall'elemento genitore.

Esempio: AlberoDivisori(20) dovrebbe produrre questo:

20 :->2 - 4 - 5 - 10
4 :->2
10 :-> 2 -5

praticamente la root è 20. poi la lista dei nodi figli (LinkedList) di root è 2-4-5-10 (che sono i divisori di 20 diversi da 1 e diversi da 20). poi a sua volta ci sono le liste dei figli, che per i numeri primi sono vuote mentre per gli altri no (in questo caso abbiamo 4 e 10).

Ora, senza che vi posto tutte le classi e le interfacce da utilizzare per questo esercizio, vi posto direttamente l'algoritmo che ho scritto:

public Albero<Integer> alberoDivisori(int n) {
		Albero<Integer> toReturn = new MyTree<Integer>(n);
		alberoDivisori(n,2,toReturn.root());
		return toReturn;
	}
	
	private void alberoDivisori(int n,int k,NodoAlbero<Integer> nodo) {
		if (k>n/2) return;
		if (n%k==0) {
			NodoAlbero<Integer> aux = nodo.addChildren(k);
			alberoDivisori(k,2,aux);
		}
		alberoDivisori(n,k+1,nodo);
	}
vi dico solamente che Albero è un interfaccio e MyTree è la classe concreta. Il costruttore crea un albero con radice con elemento uguale ad n. I nodi dell albero hanno 2 variabili di istanza: in una è memorizzato l'elemento(di tipo int in questo caso) e nell'altra la lista dei nodi figli (se nn hanno nessun figlio è una lista vuota sempre di tipo Linkedlist).
Il metodo addChildren nn fa altro che aggiungere un figlio con elemento uguale a k alla lista dei nodifigli di nodo,e restituisce il nodo creato (che viene quindi puntato dalla variabile aux).

Ora questo algoritmo che ho scritto funziona alla grande per i primi 3999. Con 4000 non funziona e neanche con 4200,4400,4500,4600,4800,5000,10000 etc..Nn midice neanche il tipo di errore mi dà una sfilza infinita di errori in pila tutti uguali riguardanti questo rigo del codice:
alberoDivisori(n,k+1,nodo);
nn riesco proprio a capire quale possa esser eil problema...concettualmente l'algoritmo mi sembra giusto e infatti funziona bene per la maggior parte dei numeri. Avevo pensato ad uno stackoverflow e ho provato ad aumentargli la memoria con il comando –Xmx1024M ma niente. Poi cmq mi sembra strano visto che fino a 3900 è velocissimo e poi improvvisamente con 4000 nn ce la fa più.
Secondo voi da cosa può dipendere?

grazie mille in anticipo per qualsiasi aiuto!

1 Risposte

  • Re: Problema esercizio albero n-ario

    Nessuno sa aiutarmi?

    sapete dirmi se esiste un modo per visualizzare che tipo di errore mi dà sul prompt? perchè mi da una sfilza infinita di
    "at nomeclasse.nomemetodo(nomefile.java:118)"
    "at nomeclasse.nomemetodo(nomefile.java:118)"
    "at nomeclasse.nomemetodo(nomefile.java:118)"
    "at nomeclasse.nomemetodo(nomefile.java:118)"
    "at nomeclasse.nomemetodo(nomefile.java:118)"
    ......etc

    senza pero che io riesca vedere di che tipo di errore si tratta. Esiste un modo per visualizzarlo?
Devi accedere o registrarti per scrivere nel forum
1 risposte