Duda en java

E

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!

Elinombrable

Foro adecuado --> http://www.mediavida.com/foro/dev

SasSeR_18

O si no aquí: http://www.mediavida.com/foro/estudios-trabajo

Ahí siempre estarán a tu disposición cada vez que quieras que te hagan los deberes del cole

Elinombrable

#Tienes la fórmula en la wikipedia, simplemente tienes que trasladarlo a tu código Java:

P(0) = 3, P(1) = 0, P(2) = 2,
y
P(n) = P(n − 2) + P(n − 3) si n > 2.

Resumiendo en pseudocódigo:


public int Perrin(int n){

Si n es 0, devolvemos 3.

Si n es 1, devolvemos 0.

Si n es 2, devolvemos 2.

Si n es mayor que 2, devolvemos ( Perrin(n − 2) + Perrin(n − 3))

}


Una vez tengas la funcion hecha, simplemente la llamas con los valores que quieres imprimir. Si quieres imprimir el primer valor de la serie, le pasas a la funcion un 0, si quieres imprimir el segundo valor, le pasas un 1, un 2 para el tercero y así consecutivamente.

Típico ejemplo de recursividad donde una función se llama a sí misma ;)

E

Pues no lo pillo, lo siento :wtf: . Es decir el pseudocódigo me queda claro. Pero cuando pones Perrin(n-2)....Que es perrin? (como variable me refiero).

En la wiki viene la función generadora, pero no la entiendo, supuestamente ahi que darle valores, pero si yo le doy el valor 4 por ejemplo, no me sale el valor 4 de la sucesión de Perrí...

Perdonen pero estoy muy verde, por eso estoy tratando de aprender. Un saludo y gracias!!

1 respuesta
Lecherito

#5 Mira unos cuantos tutoriales sobre Recursividad

E

Buenas a todos ya he conseguido hacerlo, aquí os dejo 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();

	}

}

}

Saludos y gracias!!

1 respuesta
gonya707

#7 Un detalle por un poco de decoro: las clases con la primera letra mayuscula y lo que no son clases no.

1 1 respuesta
E

#8 Tienes razón perdón, me lo tienen dicho pero se me pasa. Soy principiante ;(.

Gracias por el consejo! Saludos!

JuAn4k4

¿ Lo del iterator lo necesitabas realmente ?

public class Perrin {
	public long calculate(long n) {
		if (perrin < 0) {
			throw new IllegalArgumentException("perrin(n) : n >= 0");
		}
		switch (n) {
			case 0: return 3;
			case 1: return 0;
			case 2: return 2;
			default: return perrin(n-2) + perrin(n-3);
		}
	}
}
1 respuesta
DarkSoldier

vengo a comentar lo del spanglish en el codigo xDD

#12 lo del spanglish es por lo de checkElementos y cosas así! no te sientas criticado por mi xD que encima hago lo mismo... jaja

1 respuesta
E

#10 #11 Hola, era un ejercicio de clase. El objetivo era trabajar con ITERABLES VIRTUALES E ITERABLES A PARTIR DE AGREGADOS jejeje. Estoy en primero de Ing.Informática, y nunca antes de este año había programado, ni tenia idea de lo que era...Por eso lo de los iterables, y supongo que algunas incoherencia en el código y demás, como lo de las mayúsculas y spaniglish, que si bien es cierto no es que sea erróneo, pero comprendo que sean normas de estilo a respetar.

Los profesores nos dicen que al principio cuesta mucho pero que cuando ya llevas 7 u 8 meses tu cabeza cambia el chip y nos resulta todo más fácil...Ojala sea verdad, porque a mi me esta costando jejeje. Además de que de programación sólo tengo una asignatura, también me tengo que ocupar de álgebra,cálculo, física, y mil cosas más...

Con esto quiero decir que soy muy novato, y perdonen si hay cosas que no se deberían de hacer, pero lo hago lo mejor que puedo, estoy aprendiendo, espero con el tiempo llegar a vuestro nivel...

Saludos y gracias a todos por vuestra ayuda! me pasare por aquí a menudo para aprender y preguntar dudas XD.

gonya707

Yo no entiendo como pueden enseñar en una carrera a programar con Java xD GG cuando veas ensamblador o punteros con C o C++

1 2 respuestas
B

#13 muchas carreras no requieren ni saber punteros como tales en C, y mucho menos ensamblador. Piensa que cada vez más las carreras se van a lo práctico, y hoy en día lo práctico es formar a futuros corbatitas para consultoras de mierda. Programadores / ingenieros de sistemas embebidos son la excepción, no la norma. Aquí todo hijo de vecino se dedica a hacer webs con php/python/ror xD

Que no digo que me parezca bien, pero es la realidad. Por ejemplo a mí me interesa "ensamblador", que más bien LLVM/JVM para hacer compiladores, pero no necesito ni necesitaré nunca ensamblador "clásico" (y sí, lo aprendí y lo utilicé).

Hay que enseñar programación con LISP, como en el MIT xD (ahora creo que cambiaron a Python).

PD: Lo que quiero decir con esto es que hay muchas formas de trabajar. Algunos creerán que no saber nada de computación numérica es una aberración, otros que no saber nada de programación funcional / compiladores / lógica, otros C/ensamblador, otros RoR + HTML5 + CSS + JS...

No se puede saber de todo. Y Java es un mal lenguaje para empezar, estoy de acuerdo. Pero vamos yo empecé con Pascal (que tendrá punteros y lo que quieras pero beh) y no me costó aprender ni C ni ensamblador.

2 1 respuesta
JuAn4k4

Yo empecé con C, y lo haciamos todo mal, pero de eso te das cuenta con el tiempo.

E

#14 Buenas amigo, pues no se si hablas de una ingeniería o de un Fp....

Hemos empezado con Java porque según el catedrático que me da, es más fácil cambiar de Java a C, que de C a Java. Y eso supuestamente se puede aplicar a cualquier lenguaje orientado a objetos.

De todas formas de aquí a 1 mes, o menos,empezamos con C, hasta final de curso. Es el primer año, y todas las asignaturas son de Formación Básica, y común en muchas ingenierías. Y en algunas viene delante la palabra fundamento o intoducción....Como por ejemplo Introducción a la matemática Discreta o Fundamentos de Programación, que es la de este año...

También te comento que ya este año, en Estructura de Computadores estamos aprendiendo Verilog y algo de Ensamblador. El año que viene creo que tengo una asignatura dedicada en gran parte a este último...

Con esto lo que quiero decir, es que en mi opinión te has tirado un poco el moco ahí con lo que no necesitan saber ni punteros ni nada....Pero es sólo eso, una opinión, con el tiempo podré afirmarlo, o no.

Saludos y gracias a todos!

1 respuesta
B

#16: No me has comprendido. Me refiero a que #13 se escandalizaba por lo de no saber punteros o ensamblador (o tener difícil su comprensión) y la realidad es que el 90% de la gente que trabaja de esto no los utiliza así que no es que fuese tan grave aún en ese caso (yo ya me imaginaba que los darías más adelante).

No tengo nada que decir respecto a ti o a tu plan de estudios, esto no iba contigo. Me refería a carreras profesionales, ya sé que cualquier carrera mínimamente decente te lo va a enseñar.

1 respuesta
E

#17 Tienes razón, muchas gracias por la aclaración XD.

Usuarios habituales