|
| HOMEPAGE | INDICE FORUM | REGOLAMENTO | ::. | NEI PREFERITI | .:: | RSS Forum | RSS News | NEWS web | NEWS software | |
| PUBBLICITA' | | | ARTICOLI | WIN XP | VISTA | WIN 7 | REGISTRI | SOFTWARE | MANUALI | RECENSIONI | LINUX | HUMOR | HARDWARE | DOWNLOAD | | | CERCA nel FORUM » | |
29-01-2005, 11.32.43 | #1 |
Made in Japan
Top Poster
Registrato: 04-07-2001
Messaggi: 4.461
|
[Java] Numero attivazioni di un metodo ricorsivo
Il problema è che nella chiamata ricorsiva ci sono 2 invocazioni a tale metodo e come ho provato io vengono fuori dei casini. Avete qualche idea su come risolvere la questione? Codice:
import javax.swing.JOptionPane; public class Fibonacci { public static int fibonacci(int n) { if(n==0) return 0; else if(n==1) return 1; else return fibonacci(n-2)+fibonacci(n-1); } public static void main(String[] args) { int n = Integer.parseInt(JOptionPane.showInputDialog("Inserisci un valore per n")); int ris = fibonacci(n); System.out.println("Il valore risultante e': "+ris); System.exit(0); } } |
29-01-2005, 13.35.25 | #2 |
Gold Member
Top Poster
Registrato: 18-07-2002
Messaggi: 6.399
|
Presumo che interessi vedere, alla fine, quante volte si è entrati nel metodo. Per questo basta mettere un attributo di classe (pure static, visto che ci devi accedere da un metodo static) da usare come contatore:
Codice:
import javax.swing.JOptionPane; private static int chiamate = 0; public class Fibonacci { public static int fibonacci(int n) { chiamate ++; if(n==0) return 0; else if(n==1) return 1; else return fibonacci(n-2)+fibonacci(n-1); } public static void main(String[] args) { int n = Integer.parseInt(JOptionPane.showInputDialog ("Inserisci un valore per n")); int ris = fibonacci(n); System.out.println("Il valore risultante e': "+ris); System.exit(0); } } Codice:
F(4): chiamate=1 |--- F(2): chiamate=2 | |---- F(0): chiamate=3 //termina | |---- F(1): chiamate=4 //termina |--- F(3): chiamate=5 |---- F(1): chiamate=6 //termina |---- F(2): chiamate=7 |---- F(0): chiamate=8 //termina |---- F(1): chiamate=9 //termina chiamate = 9 Se per esempio ti interessa vedere solo il numero dei livelli finali, basta incrementare chiamate solo per n==0 o n==1. Ciao |
29-01-2005, 13.57.52 | #3 | |
Gold Member
Top Poster
Registrato: 18-07-2002
Messaggi: 6.399
|
Quota:
C'è però, volendo, un altro aspetto da considerare: il valore di chiamate non funziona bene: se chiami prima fibonacci(5) e poi ancora fibonacci(4), alla seconda chiamata ti restituisce un numero sballato, e forse era proprio questo il tuo problema. Potresti però aggirare il problema così: usi una variabile interna al metodo, e la poni a true se e solo se il valore di chiamate è pari a 0; alla fine del metodo poi controlli se sta variabile è true, e nel caso rimetti chiamate a 0. Codice:
import javax.swing.JOptionPane; private static int chiamate = 0; public class Fibonacci { public static int fibonacci(int n) { int result; boolean first = false; if (chiamate == 0) first = true; chiamate ++; if(n==0) result 0; else if(n==1) result 1; else result fibonacci(n-2)+fibonacci(n-1); (if first == true) chiamate = 0; return result; } public static void main(String[] args) { int n = Integer.parseInt(JOptionPane.showInputDialog ("Inserisci un valore per n")); int ris = fibonacci(n); System.out.println("Il valore risultante e': "+ris); System.exit(0); } } |
|
29-01-2005, 14.42.06 | #4 |
Made in Japan
Top Poster
Registrato: 04-07-2001
Messaggi: 4.461
|
Con la soluzione del primo post funziona. Il fatto è che in un esempio il tutto veniva fatto aggiungendo un parametro al metodo e modifcando questo ad ogni invocazione. L'esempio però era su una ricorsione semplice, mentre questa è multipla e mi ha messo in difficoltà. Passando un parametro per tenere traccia del numero di attivazioni proprio non ho trovato soluzioni, ma magari in caso di ricorsioni multiple non è neanche fattibile.
Avevo fatto così: Codice:
import javax.swing.JOptionPane; public class Fibonacci { public static int fibonacci(int n, int att) { att++; System.out.println("invocazione: "+att); if(n==0) return 0; else if(n==1) return 1; else return fibonacci(n-2,att)+fibonacci(n-1,att); } public static void main(String[] args) { int n = Integer.parseInt(JOptionPane.showInputDialog("Inserisci un valore per n")); int ris = fibonacci(n,0); System.out.println("Il valore risultante e': "+ris); System.exit(0); } } 1 2 3 3 2 3 3 4 4 Il valore risultante e': 3 |
29-01-2005, 14.48.58 | #5 |
Gold Member
Top Poster
Registrato: 18-07-2002
Messaggi: 6.399
|
Al momento della chiamata della seconda ricorsione, dovresti poter avere accesso al valore di att calcolato nella prima, ma questo non lo puoi fare, perchè il valore che ti serve è una variabile interna del metodo fibonacci. Quindi l'unica cosa da fare è rendere questa variabile esterna al metodo, come nel mio esempio.
In C per esempio si potrebbe fare, passando le variabili per riferimento (qui invece si è costretti, per passare il riferimento - passami il termine - a usare una variabile globale). |
29-01-2005, 15.00.59 | #6 |
Made in Japan
Top Poster
Registrato: 04-07-2001
Messaggi: 4.461
|
Credo anch'io che sia l'unica soluzione.
|
Utenti attualmente attivi che stanno leggendo questa discussione: 1 (0 utenti e 1 ospiti) | |
Strumenti discussione | |
|
|
Discussioni simili | ||||
Discussione | Autore discussione | Forum | Risposte | Ultimo messaggio |
[JAVA] Passare oggetto come parametro ad un metodo | Downloader | Programmazione | 7 | 09-04-2005 18.58.24 |
Portabilità | Leopardo | Chiacchiere in libertà | 2 | 21-10-2004 13.52.51 |
[Java] Esercizio Telefonino | Alhazred | Programmazione | 9 | 06-03-2004 17.33.02 |