Recursividad
Buenas, me presento
Soy Jose Angel Doval nuevo en este foro y sobre todo nuevo en el tema de la programación en java, estoy aprendiendo por mi cuenta,llevo unos dias leyendo foros , viendo videotutoriales y haciendo ejercicios basicos para ir aprendiendo poco a poco.
los ejercicios que estoy haciendo son estes:
http://www.scribd.com/doc/13895214/ejercicios-de-java-para-que-puedan-pr...
he llegado hasta el ejercicio 24 inclusive con exito solamente consultando a Dios Google por aspectos relacionados con las matematicas (ando muy flojo) y algun que otro aspecto del lenguaje.
ahora mismo estoy en el ejercicio 25 el cual dice:
Pruebe la recursividad en Java. Escriba programas que calculen recursivamente las funciones f actorial(n) y Ackermann(x, y).
LA RECURSIVIDAD:
El concepto de recursividad va ligado al de repetición. Son recursivos aquellos algoritmos que, estando encapsulados dentro de una función, son llamados desde ella misma una y otra vez, en contraposición a los algoritmos iterativos, que hacen uso de bucles while, do-while, for, etc.
Definición.
Algo es recursivo si se define en términos de sí mismo (cuando para definirse hace mención a sí mismo). Para que una definición recursiva sea válida, la referencia a sí misma debe ser relativamente más sencilla que el caso considerado.
Debido a que sigo sin entender como funciona esto de la recursividad les pido si pueden darme una explicación sencilla de que es esto y que función tiene a la hora de aprender a programar?¿si es necesario saber usarla?
aun que imagino alguna de las respuestas pero yo pregunto por si con alguna de las explicaciones que me puedan dar, acabo entendiendo esto.
Tambien quiero preguntar si en este codigo ya he usado la recursividad a la hora de calcular el factorial de la variable n = 20 ?
y muchos dirán joder escribe un codigo y no sabe que es lo que significa.
pero la respuesta es que este es uno de esos casos donde e consultado un poco de codigo por no quedarme muy estancado pero creo que asi tambien voy aprendiendo.
sin mas les envio un Gran Saludo.
y les pido que si tienen algún consejo que les halla servido de mucho a la hora de aprender este lenguaje que sepan que les escucho (bueno mas bien leo xD).
see you.
- Inicie sesión o regístrese para enviar comentarios
Recomendacion
Hola, te recomiendo leer algo que ya se ha explicado aqui mismo.
http://www.javamexico.org/blogs/oscarryz/para_entender_la_recursividad_p...
y ya si aun tienes dudas, pues serian mas especificas,
Saludos
Gracias
busque Recursividad en el search this site y no aparecio nada por eso postee.
Leyendo .....
de nuevo mil gracias
Acerca del codigo que pones.
Acerca del codigo que pones. No, esa es una versión no recursiva del factorial.
Una versión recursiva sería:
public static void main( String ... args ) {
System.out.println( factorial( 5 ) );
}
public static int factorial (int x) {
if( x == 0 ) {
return 1;
}
return x * factorial( x -1 );
}
}
Si observas, para definir el método, esta versión se llama a si misma
return x * factorial( x -1 )
. Es decir re-cursa, el camino.Espero que esto te sirva.
re-cursa
Jajajajaj ya hasta justificamos las malas traducciones al español, muy bueno ese. La traducción estrictamente correcta debe ser recurrencia, funciones recurrentes (no recursivas), y puedes decir que recurren a sí mismas.
tsssss para que veas el nivel
tsssss para que veas el nivel que me cargo ;)
Para mí es más fácil pensar que re-cursa el camino a que re-curre a si misma.
Pero la traducción estricta, estricta, estricta, es: recursiva.
Fuera de este pequeño detalle, el concepto sigue siendo correcto.
Seguiré investigando
he resuelto la primera parte de el ejercicio asi
utilizando la version recursiva del factorial que me dices Oscar.
ahora seguiré investigando para hacer la segunda parte pues ingreso en el Hospital para operarme de una rodilla y mientras recupero tengo tiempo a investigar XD
Gracias y un saludo
class Ej25{
public static void main( String [] args ) {
Scanner miScanner1=new Scanner(System.in);
System.out.println("Introduce el numero para el cual quieres calcular el factorial: ");
double n = miScanner1.nextInt();
System.out.println("Calcuando ..............");
System.out.println("El factorial del numero que has introducido es: "+ factorial(n) );
}
public static double factorial (double x) {
if( x==0 ) {
return 1;
}
return x*factorial( x-1 );
}
}
recursivo
Ya sé que últimamente ha perdido algo de credibilidad con lo de quitar algunos acentos y demás, pero:
http://buscon.rae.es/draeI/SrvltConsulta?TIPO_BUS=3&LEMA=recursivo
http://buscon.rae.es/draeI/SrvltConsulta?TIPO_BUS=3&LEMA=recurrente
Y ya de paso, aunque creo que nadie lo ha dicho en este post pero se dice mucho en sistemas:
http://buscon.rae.es/draeI/SrvltConsulta?TIPO_BUS=3&LEMA=accesar
Bueno, hasta el spellchecker de Chrome (que no he encontrado cómo carajos desactivar ya de manera general) me ilumina "recursivo" y "accesar", pero no "recurrente".
Así que la traducción estricta, estricta, estricta, estricta, estricta, estricta, estricta, estricta, estricta, estricta, estricta, es recurrente. Porque la palabra recursiva no existe.
ohhhhhh hasta clases de
ohhhhhh hasta clases de español se dan en los foros no pues ahora si que es muy robusto...
wiki
Recurrente en la wikipedia --> http://es.wikipedia.org/wiki/Recurrente
Recursivo en la wikipedia --> http://es.wikipedia.org/wiki/Recursivo
jajaja te manda al mismo. xD
Aparte de esto.
Necesito resolver una duda, he acabado con el código para el ejercicio (o eso creo). es funcional pero .... cuando introduzco valores de "x" y "y" >= 4 y 5. se jode
salta el error
Exception in thread "main" java.lang.StackOverflowError
con una referencia a la linea 29 y muchísimas referencias a la linea 31.
29: return Ak(a-1,1);
31: }return Ak(a-1,Ak(a,b-1));
con valores entre 1 y 1 o 3 y 4 funciona.
Os dejo el código del ejercicio
class Ej25{
public static void main( String [] args ) {
Scanner miScanner1=new Scanner(System.in);
System.out.println("Introduce el numero para el cual quieres calcular el factorial: ");
double n = miScanner1.nextInt();
Scanner miScanner2=new Scanner(System.in);
System.out.println("Introduce ahora el valor de x para la funcion de Ackermann: ");
int a = miScanner2.nextInt();
Scanner miScanner3=new Scanner(System.in);
System.out.println("Introduce ahora el valor de y para la funcion de Ackermann: ");
int b = miScanner3.nextInt();
System.out.println("Calcuando factorial de: "+n);
System.out.println("El factorial es: "+ factorial(n) );
System.out.println("Calcuando la funcion de Ackermann: A("+a + "," +b +")");
System.out.println("El resultado es: "+ Ak(a, b));
}
public static double factorial (double x) {
if( x==0 ) {
return 1;
}
return x*factorial( x-1 );
}
public static int Ak(int a , int b ){
if(a==0){
return b+1;
}else if(b==0){
return Ak(a-1,1);
}else{
}return Ak(a-1,Ak(a,b-1));
}
}
Se me olvida
Se me olvido deciros que la segunda parte del ejercicio trata de la función de Ackerman
http://es.wikipedia.org/wiki/Funci%C3%B3n_de_Ackermann
Gracias y un Saludo
jajaj, ya aparecerá (
jajaj, ya aparecerá ( eventualmente ).
Accesar definitivamente no existe, es acceder.
Estas son las cosas que suceden con los idiomas cuando evolucionan e interactuan ( a caray, la palabra interactuan, tampoco existe? ) con otros idiomas ( en este caso el inglés ) y sobre todo con todas las palabras que se van inventando día a día.
Está el caso también, antes mencionado de "fichero vs. archivo" o "computadora vs. ordenador" y etc. etc.
Pero eventualmente la palabra recursivo aparecerá, es cuestión de tiempo. Por ejemplo un par de palabras que pasaron del inglés al español , son "Líder" ( del inglés Leader ) y Mitin ( del inglés Meeting )
http://buscon.rae.es/draeI/SrvltConsulta?TIPO_BUS=3&LEMA=l%C3%ADder
http://buscon.rae.es/draeI/SrvltConsulta?TIPO_BUS=3&LEMA=mitin
Para desactivar en chrome: boton derecho > language settings > check spelling
p.d. Pensándolo bien como la palabra "recursivo" es tan poco usada, quizá nunca aparezca.
hay que leer
bueno ahora entiendo porque te marca error se me hace que no leiste completo el articulo de la wikipedia
Se puede intentar con un caso algo más complicado— como A(4, 3); el primer valor que no cabe en el universo físico
y te preguntas porque marca error de StackOverflowError vamos vamos que los int se quedan cortos en esta clase de interaccionesrecursión, ackerman
Sí porque la recursión es un concepto muy nuevo que salió hace 6 meses y por eso falta algo de tiempo para que lo acepten, como "googlear". Pfff. Eso de que no existía "recursivo" lo vi desde la universidad. No va a cambiar, porque tenemos cursivo y recursivo sería un refuerzo de ese término. Y como dices, es muy poco utilizada. Y es una pochez.
En Chrome botón derecho sobre un textfield o area de texto me da "spell checker options --> check spelling in this field" pero eso solamente sirve para ESTE campo. Al hacer submit, si escribo otro comentario, ya es OTRO campo, y se reactiva el spell check (estoy en Mac, tal vez Win/Linux sea distinto).
Wikipedia no debe ser usado como referencia oficial. Cualquiera puede meter el término accesar y no por eso es correcto. Líder y mitin fueron aceptados hace muuuuuchos años.
JAD: tu código, si es que lo pegaste de lo que realmente estás corriendo, está mal. O al menos está raro. El último return de
Ak
está fuera del else, que está vacío. Si el else está vacío, para qué lo quieres? Ese último return debería ir dentro del else (aunque no hay diferencia en la práctica, hay que hacerlo legible). Por lo que veo la función tiene una condición de salida muy específica: solamente si a=0 te va a devolver b+1, de otra forma siempre se invoca, incluso anidada. Supongo que tendrás que incrementar el stack cuando corres esa función. Eso es con el argumento -Xss de la JVM:Eso le dará 128MB al stack. Si te sigue dando error de StackOverflow entonces increméntale el stack. O tal vez la idea del ejercicio es mostrarte funciones que si las implementas de manera recurrente, no hay stack que las aguante, y por eso tienes que hacer una implementación iterativa.
ah jajajajaj
yo la verdad no vi el artículo de wikipedia, solamente el código de JAD. Pero eso de que no cabe en el universo físico pues creo que ya nos deja sin dudas. Con razón lo dejé corriendo y nomás no acaba...
Es como teclear "google" en Google... dicen que no hay que hacerlo, porque el universo implota...