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 ?

class Ej16{
    public static void main(String[]args){
       
        double factorial=1;
        double numero=20;
        while(numero!=0){
            factorial=factorial*numero;
            numero--;
            System.out.println(factorial);
        }

    }
}

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.

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de bimboso_d

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

Imagen de java el JAD

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:

class FactorialDemo {
  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.

Imagen de ezamudio

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.

Imagen de java el JAD

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

import java.util.Scanner;
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 );
   }
}
Imagen de ezamudio

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.

Imagen de ArenasMx

ohhhhhh hasta clases de

ohhhhhh hasta clases de español se dan en los foros no pues ahora si que es muy robusto...

Imagen de java el JAD

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

import java.util.Scanner;
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));
  }
}
Imagen de java el JAD

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.

Imagen de ArenasMx

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 interacciones

Imagen de ezamudio

recursió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:

java -Xss128m TuClase

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.

Imagen de ezamudio

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...