Algoritmos recursivos

7
Capitulo 4: Algoritmos Capitulo 4: Algoritmos recursivos recursivos

Transcript of Algoritmos recursivos

Page 1: Algoritmos recursivos

Capitulo 4: Algoritmos Capitulo 4: Algoritmos recursivosrecursivos

Page 2: Algoritmos recursivos

Conceptos básicos de recursividadConceptos básicos de recursividad

Se dice que un método es recursivo si contiene llamadas o Se dice que un método es recursivo si contiene llamadas o

invocaciones a sí mismo.invocaciones a sí mismo.

Un método recursivo tendría este aspecto:Un método recursivo tendría este aspecto:

… … metodoRecursivo (…){metodoRecursivo (…){

…… ……

metodoRecursivo (…);metodoRecursivo (…);

…… ……

}}

Esto implica que una llamada al método recursivo puede generar una Esto implica que una llamada al método recursivo puede generar una o o

más invocaciones al mismo método, que a su vez genera otras más invocaciones al mismo método, que a su vez genera otras

invocaciones, y así sucesivamente.invocaciones, y así sucesivamente.

Page 3: Algoritmos recursivos

Condiciones que debe cumplir todo método Condiciones que debe cumplir todo método recursivorecursivo

Siempre hay que asegurar que existe una condición de salida, es decir, Siempre hay que asegurar que existe una condición de salida, es decir, si se cumple esa condición, estaremos en el caso base, donde no se si se cumple esa condición, estaremos en el caso base, donde no se producen llamadas recursivas.producen llamadas recursivas.Ejemplo para un algoritmo recursivo del factorial:Ejemplo para un algoritmo recursivo del factorial:

Además, es conveniente comprobar que:Además, es conveniente comprobar que: Entre el caso base y los casos no base, se han cubierto todos los estados Entre el caso base y los casos no base, se han cubierto todos los estados

posibles.posibles. Cada llamada, en el caso no base, conduce a problemas cada vez más Cada llamada, en el caso no base, conduce a problemas cada vez más

pequeños que necesariamente terminarán en el caso base.pequeños que necesariamente terminarán en el caso base.

CasosCasos SoluciónSolución

n=1 (caso base)n=1 (caso base) return 1return 1

n>1n>1 return n*factorial(n-1)return n*factorial(n-1)

Page 4: Algoritmos recursivos

Programa:Programa:

static int factorial (int n){static int factorial (int n){ if (n>1)if (n>1) return factorial (n-1)*n;return factorial (n-1)*n; elseelse return 1;return 1;}}

Page 5: Algoritmos recursivos

Cuándo debe utilizarse la recursividadCuándo debe utilizarse la recursividad

Ya que la solución recursiva tiene un coste de tiempo y memoria Ya que la solución recursiva tiene un coste de tiempo y memoria mayor mayor

que la iterativa. Es decir, los programas recursivos en general son que la iterativa. Es decir, los programas recursivos en general son menos eficientes. Podríamos utilizar los siguientes consejos:menos eficientes. Podríamos utilizar los siguientes consejos: Los algoritmos que por naturaleza son recursivos, y donde la Los algoritmos que por naturaleza son recursivos, y donde la

solución iterativa es complicada y debe manejarse explícitamente solución iterativa es complicada y debe manejarse explícitamente una pila para enumerar las llamadas recursivas, deben resolverse una pila para enumerar las llamadas recursivas, deben resolverse por métodos recursivos.por métodos recursivos.

Cuando haya una solución obvia por iteración al problema, debe Cuando haya una solución obvia por iteración al problema, debe evitarse la recursividad.evitarse la recursividad.

A continuación, se verá un ejemplo donde no debe utilizarse la A continuación, se verá un ejemplo donde no debe utilizarse la recursividad, aunque la solución recursiva es muy sencilla y natural recursividad, aunque la solución recursiva es muy sencilla y natural pero extremadamente ineficiente. La solución iterativa es mucho más pero extremadamente ineficiente. La solución iterativa es mucho más eficiente aunque no tan trivial.eficiente aunque no tan trivial.

Page 6: Algoritmos recursivos

Calcular el término n de la sucesión Fibonacci.Calcular el término n de la sucesión Fibonacci.Fibonacci (n) = n, si n= 0, o n=1;Fibonacci (n) = n, si n= 0, o n=1;Fibonacci (n) = Fibonacci (n-1) + Fibonacci (n-2), si n>1Fibonacci (n) = Fibonacci (n-1) + Fibonacci (n-2), si n>1Programa:Programa:Public int fib (int n){Public int fib (int n){ if (n>1)if (n>1) return fib(n-1) + fib(n-2);return fib(n-1) + fib(n-2); elseelse return n;return n;}}Es ineficiente comparado con el iterativo ya que cuando un número n Es ineficiente comparado con el iterativo ya que cuando un número n sea mayor que 1 invocará a la llamada dos veces lo cual implica mayor sea mayor que 1 invocará a la llamada dos veces lo cual implica mayor tiempo de ejecución y más memoria.tiempo de ejecución y más memoria.

Page 7: Algoritmos recursivos

Algoritmos de backtrakingAlgoritmos de backtraking

El backtraking o “vuelta atrás” es una técnica algorítmica de resolución El backtraking o “vuelta atrás” es una técnica algorítmica de resolución

general de problemas mediante una búsqueda sistemática de general de problemas mediante una búsqueda sistemática de

soluciones.soluciones.

Se descompone la tarea a realizar en tareas parciales de posibles Se descompone la tarea a realizar en tareas parciales de posibles

soluciones, y estas tareas parciales a su ves se descompondrán en soluciones, y estas tareas parciales a su ves se descompondrán en

más tareas, en caso de que una tarea no conduzca a una solución se más tareas, en caso de que una tarea no conduzca a una solución se

tendrá que hacer vuelta atrás guardando los puntos de elección para tendrá que hacer vuelta atrás guardando los puntos de elección para

poder volver a ellos cuando no se alcance una solución.poder volver a ellos cuando no se alcance una solución.