Algoritmos paralelos básicos Algoritmos paralelos Glen Rodríguez.
Algoritmos recursivos
-
Upload
jefferson-sarmiento -
Category
Technology
-
view
41.055 -
download
1
Transcript of Algoritmos recursivos
Capitulo 4: Algoritmos Capitulo 4: Algoritmos recursivosrecursivos
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.
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)
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;}}
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.
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.
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.