PDA

Visualizza versione completa : [java] funzione di ackermann: StackOverflowError...


Algeron
15-03-2005, 11.12.23
salve!

volevo reaizzare un programmino in java per il calcolo della funzione di Ackermann, quando mi sono trovato di fronte ad uno java.lang.StackOverflowError... credo di aver capito che il programma effettua troppe chiamate ricorsive. Il problema è che mi dà questo errore anche per valori che dovrebbero essere facilmente calcolabili, come posso fare? :confused:

Dav82
15-03-2005, 20.23.39
Posti il codice che vediamo un po'? :)

Alhazred
16-03-2005, 10.54.18
Ackermann da stack overflow già con valori piccoli, tipo 4 e 1 credo siano già sufficienti.

Algeron
16-03-2005, 16.36.36
Eccovi la parte significativa del codice:

static double a=0;

public static double ack(double x, double y){
if(x==0) a=y+1;
else if (y==0) ack(x-1, 1);
else ack(x-1, ack(x,y-1));
return a;
}

Reitituisce valori corretti finchè non da' errore di overflow...
se provo ack(6,1) non ce la fa.
visto che ho trovato su internet risultati per valori maggiori vorrei sapere come posso calcolarli.

Alhazred
20-03-2005, 17.05.49
Il codice puoi modificarlo così in modo da risparmiarti la variabile di istanza a:

import javax.swing.JOptionPane;

public class Ack{
public static double ack(double x, double y){
if(x==0) return y+1;
else if(y==0) return ack(x-1,1);
else return ack(x-1,ack(x,y-1));
}
public static void main(String[] args){
double x = Double.parseDouble(JOptionPane.showInputDialog("Inserisci x:"));
double y = Double.parseDouble(JOptionPane.showInputDialog("Inserisci y:"));
System.out.println("Il valore e': "+ack(x,y));
System.exit(0);
}
}

Comunque è normale che con (6,1) ti dia stack overflow, ho provato e come ti avevo detto si va in overflow già con (4,1).

Algeron
21-03-2005, 22.57.23
ma questo limite non può essere superato in java? e usando altri linguaggi di programmazione è possibile ottenere risultati più elevati?

c'è un modo per concedere l'utilizzo di maggiori risorse di calcolo? insomma... se da' uno stack overflow, vuol dire che questo stack è troppo piccolo... (credo... è una mia interpretazione)

è solo per curiosità, visto che è possibile calcolare risultati + elevati, vorrei sapere come si fa...

LoryOne
22-03-2005, 12.17.35
Cerca di evitare la ricorsione in primis...