Duda en Java

Hola buenas, no se si éste es el foro apropiado para esto, pero no he encontrado otro apartado mejor...Si no lo es, que lo borren o lo cambien de sitio, no hay problema XD .

Mi duda es que quiero programar en java los números de Perrín, pero no se como, he intentado varias cosas pero me da error, a ver si alguien por aquí tiene idea de como hacerlo y me da una pista o algo jejeje.

Número de Perrín: http://es.wikipedia.org/wiki/N%C3%BAmero_de_Perrin

Un saludo y gracias de antemano!
Imagen

Es darle el valor a x xD. Si quieres el primero puedes le pones un 1, si quieres el segundo le pones un 2...

PD: Por eficiencia, no uses Math.pow() para las potencias. Haz x*x que será más eficiente...
No se si es que llevo mucho sin estudiar matematicas o la explicación de la wikipedia esta hecha con el orto.

Lo que yo veo es crear un objeto de tipo vector.
Vector<Integer> v=new Vector<>();


Meter los que son constantes:
v.add(3);
v.add(0);
v.add(2);

Y ahora para generar mas.
for(int i=3;i<los que quieras generar;i++){
    int n=v[i-2]+v[i-3];
    v.add(n);
}


No es una obra maestra pero creo que funcionará. Habría que hacerlo un poco mas limpio eso si xD.
Gracias a ambos, una duda respecto de la función generadora. A que te refieres con darle valores? Porque si yo le doy a x=4 por ejemplo, no me sale el valor de Perrin en la posición n=4. Seguramente me he equivocado a la hora de interpretarla por eso pregunto.

Un saludo y perdonen mi ignorancia!
mariobros_95 escribió:Gracias a ambos, una duda respecto de la función generadora. A que te refieres con darle valores? Porque si yo le doy a x=4 por ejemplo, no me sale el valor de Perrin en la posición n=4. Seguramente me he equivocado a la hora de interpretarla por eso pregunto.

Perdón, empieza en el cero. Asi que el elemento primero es el 0, el segundo es el 1 y el tercero es el 2.
Gracias a todos por vuestra ayuda, al final ya lo he conseguido. Este es el código por si os interesa:

public class SecuenciaPerrin implements Iterable<Integer> {

   private Integer NumElementos;

   public SecuenciaPerrin(Integer numElementos) {
      NumElementos = numElementos;
      checkNumElementos(numElementos);
   }

   public static void checkNumElementos(Integer a) {
      if (a < 0) {
         throw new IllegalArgumentException(
               "El valor introducido debe ser mayor que 0");
      }
   }

   public Iterator<Integer> iterator() {
      return new IteradorSecuenciaPerrin();
   }

   private class IteradorSecuenciaPerrin implements Iterator<Integer> {

      private Integer resultado;
      private Integer n = 0;

      public boolean hasNext() {

         return n < NumElementos;
      }

      public Integer Perrin(Integer a) {

         if (a == 0) {
            resultado = 3;

         }
         if (a == 1) {
            resultado = 0;
         }
         if (a == 2) {
            resultado = 2;
         }
         if (a > 2) {
            resultado = Perrin(a - 2) + Perrin(a - 3);

         }
         return resultado;

      }

      public Integer next() {
         if (!hasNext()) {
            throw new NoSuchElementException();
         }

         resultado = Perrin(n);
         n++;

         return resultado;

      }

      @Override
      public void remove() {
         throw new UnsupportedOperationException();

      }

   }

}


Lo que hace el código es lo siguiente: Yo le doy un número, por ejemplo 13, y me devuelve los 13 primeros elementos: 3, 0, 2, 3, 2, 5, 5, 7, 10, 12, 17, 22, 29.

Gracias a todos!
¿Es una tarea de clase? ¿Tienes que hacerlo así? :-?

Porque lo veo demasiado complejo, esto es una implementación que se me ocurre:
public class SecuenciaPerrin
{
    /* desde >= 0 && hasta > desde */
    public static int[] Perrin(int desde,int hasta)
    {
        int Vector[] = new int[hasta-desde];

        for (int i = desde;i < hasta;i++)
                Vector[i-desde] = Perrin(i);     
       
        return Vector;
    }
    /* n >= 0 */
    public static int Perrin(int n)
    {
        return (3 - n*n)/(1 - n*n - n*n*n);
    }
};


Un método te genera un elemento N y otro método te genera un vector entre dos intervalos.
Si, es un ejercicio de clase jejeje. El objetivo es trabajar con iterables virtuales e iterables a partir de agregados.

Tu método es muy simple, pero creo que más avanzado en conocimientos. Estoy en primero de Ingeniería Informática, y nunca antes había programado nada antes de este año, por lo que aún no tengo cogido el chip del todo de esto de programar. Así que voy siguiendo lo que me van diciendo...

Pero me apunto tú método también jajaja!
Aaah, ahora entiendo lo de los iteradores [+risas]

Pues entonces está bien, se puede cambiar el método recursivo (en su lugar, te guardas los dos resultados anteriores y aou). Aunque ese te debería bastar, lo importante ahí es saber usar iteradores ;)
amchacon escribió:Aaah, ahora entiendo lo de los iteradores [+risas]

Pues entonces está bien, se puede cambiar el método recursivo (en su lugar, te guardas los dos resultados anteriores y aou). Aunque ese te debería bastar, lo importante ahí es saber usar iteradores ;)


Muchas gracias crack! Así da gusto [carcajad] .

Saludos!
9 respuestas