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!