Ayuda urgente serie de ackerman iterativo

artanos

Lanero Regular
27 Oct 2008
20
Bueno Muchachos yo se que no escribo mucho ni comento, pero no crean q no me la paso atento a todo... estoy realizando un programa para la serie de Ackerman iterativamente en JAVA, voy a postear todo el codigo se utilizan listas enlazadas, pilas, y el codigo del ackerman, mi problema es que las sumas no estan bien se que es un problema de logica pero no veo en donde se encuentra les agradeceria cualqueir ayuda que me puedan brindar.


Código:
public class CDatos {
    public int m,n;
    public CDatos (int im, int in){
        m=im;
        n=in;
    }
    public int obtenerM(){
        return m;
    }
    public int obtenerN(){
        return n;
    }
}


public class CListaCircularSE<T> {
    public CElemento ultimo = null;
    public class CElemento{
        public T datos;
        public CElemento siguiente;
        public CElemento (){}
        public CElemento (T d, CElemento s){
            datos=d;
            siguiente=s;
        }
    }
    public CListaCircularSE(){}
    public int tamaño(){
        if(ultimo==null)return 0;
        CElemento q = ultimo.siguiente;
        int n=1;
        while (q!=ultimo){
            n++;
            q=q.siguiente;
        }
        return n;
    }
    public void añadirAlPrincipio (T obj){
        CElemento q = new CElemento(obj, null);
        if (ultimo != null){
            q.siguiente = ultimo.siguiente;
        }
        else{
            ultimo = q;
            ultimo.siguiente = q;
        }
    }
    public void añadirAlFinal (T obj){
        CElemento q= new CElemento(obj, null);
        if(ultimo != null){
            q.siguiente=ultimo.siguiente;
            ultimo=ultimo.siguiente=q;
        }
        else{
            ultimo=q;
            ultimo.siguiente=q;
        }
    }
    public T borrar(){
        if(ultimo==null){
            System.err.println("Lista vacia\n");
            return null;
        }
        CElemento q=ultimo.siguiente;
        T obj=q.datos;
        if(q==ultimo){
            ultimo=null;
        }
        else{
            ultimo.siguiente=q.siguiente;
        }
        return obj;
    }
    public T obtener(int i){
        int numeroDeElementos=tamaño();
        if (i>= numeroDeElementos||i<0){
            return null;
        }
        CElemento q=ultimo.siguiente;
        for(int n=0;n<i;n++){
            q=q.siguiente;
        }
        return q.datos;
    }
}



public class CPila<T> extends CListaCircularSE<T>{
    public CPila(){}
    
    public void meterEnPila(T obj){
        añadirAlPrincipio(obj);
    }
    public T sacarDePila(){
        return (T)borrar();
    }
}


public class Iterativo {
    public static int AckermanNR(int m, int n){
        CPila<CDatos> pila=new CPila<CDatos>();
        CDatos dato;
        int Ackerman_m_n=0;
        pila.meterEnPila(new CDatos(m,n));
        while (true){
            dato= pila.sacarDePila();
            m=dato.obtenerM();
            n=dato.obtenerN();
            if (m==0){
                Ackerman_m_n=n+1;
                if (pila.tamaño()!=0){
                    dato=pila.sacarDePila();
                    m=dato.obtenerM();
                    n=dato.obtenerN();
                    pila.meterEnPila(new CDatos(m,Ackerman_m_n));
                }
                else{
                    return Ackerman_m_n;
                }
            }
            else{
                if(n==0){
                    pila.meterEnPila(new CDatos(m-1,1));
                }
                else{
                    pila.meterEnPila(new CDatos(m-1, Ackerman_m_n));
                    pila.meterEnPila(new CDatos(m, n-1));
                }
            }
        }
    }
}


public class Prueba {

    public static void main(String[] args) {
        int m, n, a;
        System.out.println ("Cálculo de A(m,n)=A(m-1,A(m,n-1))\n");
        System.out.print("Valor de m: ");m = Lectura.datoInt();
        System.out.print("Valor de n: ");n = Lectura.datoInt();
        a = Iterativo.AckermanNR(m, n);
        System.out.println("\nA("+m+","+n+")="+a);
    }

}

Utilizouna clase generica de lectura de datos de Java...profa encerio que este programa uya me ha sacado millonesimas canas :(
 
Podrias por favor poner los datos de entrada y de salida ?
Por que crees que es incorrecta la suma ?
Tal vez pueda ayudarte mejor con esos datos.
Ya has hecho una corrida de escritorio ( Prueba a papel )?
 

Los últimos temas