Lectura Complementaria Esc 8 PDF

You might also like

Download as pdf
Download as pdf
You are on page 1of 6
14.1. La naturaleza de la recursividad CapituLo 1 4 Recursividad ‘CONCEPTOS CLAVE 14.2. Recursividad directa e indirecta RESUMEN EJERCICIOS. 14.4. Recursién infinita PROBLEMAS 145. Resolucién de problemas complejos con recursividad INTRODUCCION La recursividad (recursin) es aquella propiedad que pose una funcién por la cual dicha funcién puede llamarse a si misma. Se puede utilizar Ia recursividad como una alternativa a la iteracién. Una solucion re- cursiva es normalmente menos eficiente en términos de tiempo de computadora que una solucién iterativa debido 2 las operaciones auxliares que llevan consigo las llamadas suplementarias a las funciones; sin em- bbargo, en muchas circunstancias el uso de la recursion, permite a los programadores especificar soluciones naturales, sencillas, que serfan, en caso contrario, d- ficiles de resolver. Por esta causa, la recursién es una herramienta poderosa e importante en la resolucién de problemas y en la programacién 520 | Fundamentas de programacién 14.1. LA NATURALEZA DE LA RECURSIVIDAD" Los programas examinados hasta ahora, generalmente estructurados, se componen de una serie de funciones que aman unas a otras de modo disciplinado. En algunos problemas es util disponer de funciones que se lamen a si misma, Un subprograma recursivo es un subprograma que se llama a s{ mismo ya sea directa o indirectamente. La recursividad es un (pico importante examinado frecuentemente en cursos de programacién y de introduccién a las ciencias de la computacién, En este libro se dar una importancia especial a las ideas conceptuales que soportan la recursividad, En matemé- ticas existen numerosas funciones que tienen cardcter recursivo; de igual modo numerosas circunstancias y situacio~ nes de Ia vida ordinaria tienen cardcter recursivo, Hasta el momento casi siempre sc han visto subprogramas que llaman a otros subprogramas distintos. Asi, si se dispone de dos procedimientos proct y proce, la organizacién de un programa tal y como se suele haber visto hhasla este momento podrfa adoptar una forma similar a esta: procedimiento proci(...) fin_procedimiento procedimiento proc? (...) // Llamada a proct fin_procedimiento Cuando disefian programas recursivos se tendria esta situaci6n: procedimiento proci(...) fin_procedimiento o bien esta otra procediniento proci(...) proc2(...) //Alamada a procz fin_procedimiento procedimiente proc? (...) proci(...) //Vlamada a proet fin_procedimiente Ta palabratinglesaserecrsve» y«tecursion» no ha side acepadas todavia por el Diccionario dela Real Academia dela Lengua Espa Sola (wie rae.e}. La ultima edcign 22° ‘Madrid, 2001) editada conjuntamente por toda las Academia de Ia Lengua de Bepaa, Latinoane ries y Estados Unidos recoge slo los teminossindnimos siguientes en sus acepeiones Mat (Matemdticay:recurrencia, propiedad de aquellas securncias en las que cualquier témino se puede calcuar conaciendo los prevedentes», y recurrent «Dicho den proceso: gue se Tepe. Recursivided | 521 Exempt 14.1 El factorial de un entero no negativo n, escrito n! (y pronunciado n factorial), es el producto lenin = 1st - a cn el cual or = aia 2) = 2e1 = 21 Bi = 3e2e1 = 342 4; = 4e3ezed 2 ana -5 3.2.1-5. 41-120 de modo que una definicién recursiva de Ia funcin factorial n es nlsnt(n 3)! para net El factorial de un entero n, mayor o igual a 0, se puede calcular de modo iterative (no recursivo), teniendo pre+ sente Ia definicién de n! del modo siguiente: noen* in-a) sion El algoritmo que resuelve el factorial de forma iterativa de un entero m, mayor o igual que 0, se puede caleular utilizando un bucle for: desde contador « a hasta 1 decremento 1 factorial © factorial * contador fin_desde fin ial, En el caso de implementar una funcién se requerir4 una sentencia de retorno que devuelva el valor del f tal como devolver (factorial) El algoritmo que resuelve la funci6n de modo recursive la de tencr presente una condiciGn de salida, Ast, en el caso del céleulo de 61, la definicidn es 6! = 6 x 5! y 5! de acuerdo ala definicién es 5 x 4! Este proceso continga hasta que 1! = 1 x 0! por delinicidn, EI método de definicién de una funcidn en términos de si misma se llama en mateméticas una definicién inductiva y conduce naturalmente a una implementacién recursiva. El caso base de 0! = 1 es esencial dado que se detiene, potencialmente, una cadena de lIamadas recursivas. Este caso base © condicién de salida deben fijarse en cada caso de una solucién recursiva, Fl algoritmo que resuelve ni de modo recursivo se apoya en la definicién siguiente: 522 | Fundamentas de programacién = si n= 0 nie ntin-i)tin-2)*.81 si nao en consecuencia, el algoritmo mencionado que calcula el factorial sera #4 (a = 0) entonces Contador = n - 1 fac © n * fac(contador) fin_ei Otro pseudocsdigo que resuelve la funcidn factorial es ain = 1 entonce: Fac © nefacin - 1) fined ‘Asi una funcién recursiva de factorial es: tere funcién factorial (R entero: n) si (n= 1) entonces devolver (2) devolver (n * fact fined fin_funeién Nota Dado que el valor de un factorial de un ndmero entero aumenta considerablemente a medida que aumenta el valor de n, es conveniente en el diserio del algoritmo definir el tipo de dato a devolver por la funcién como un valor real, al objeto de no tener problema de desbordamiento cuando traduzca a un cédigo fuente en un lengua- je de programacién Evempto 14.2 Deducir ta definicién recursiva del producto de niimeros naturales. El producto a * b, donde a y b son enteros positivos, tiene dos soluciones. Solucién iterativa ae peas avayeucs b Solucin recursiva atbea sibea at beat bee sibea Asi, por ejemplo, 7 3 serd: ee Recursividad | 523 En pseudocédigo se tiene: entero funcion producto (B entero, a, b) sib = 1 entonces develver (a) devolver (a*preducto (a, b-1)} fin_si fin Exemeto 14.3 Definir la naturaleza de la serie de Fibonacci: 0, 1, 1, 2, 3, 5, 8, 13, 21, Se observa en esta serie que comienza con 0 y 1, y tiene Ia propiedad de que cada elemento es la suma de los dos elementos anteriores, por ejemplo’ Entonces se puede decir que: Fibonacei (n) bonacci(n - 1) + fibonacei tm - 2) y la definicién recursiva sera bonacci(n) =n ad n= 0 bonacci(n) = fibonacci(n - 1) (2-2) aine=2 Obsérvese que la definicién recursiva de los mimeros de fibonacci es diferente de las definiciones recursivas del factorial de un nimero y del producto de dos nimeros. Asi, por ejemplo, simplificando el nombre de la funci6n por fib fib(6) = £ib(5) + fib (a) 6 lo que es igual, £: (6) ha de aplicarse en modo recursivo dos veces, y asf sucesivamente, Las funciones iterativa y recursiva implementadas en Java son public class Fibona: { //Pibonaces it public static long fibonaccii (int n) long f = 0, fsig = 1 for (int i= 0; i «nz its) tive long aux = fig; 524 | Fundamentas de programacién fsig + £ f= aux: return (f) ; /Pibonacei recursive public static long fibonaccir(int n) // si nes menor que 0 devuelve -1 como seal de error if (n < 0) return -1; // especiticar 0 es necesario, ya que // cuando ge return se retorna a la sentencia llanadora Hy la sig uceién ya no ge ejecuta if (n == 0) return (0) ; els if (n= 3) return(1); else return (fibonaccir(n-1) +fibonaceir (n-2)} public static void main(string[] args) system.o In ("Fibonacci_iterativo("+8+") «"4fibonaccii(8)) 5 System.oi tn ("Fibonaces recursive ("+8+") ="+fibonaccii(8)) ; 14.2. RECURSIVIDAD DIRECTA E INDIRECTA En recursi6n directa el c6digo del subprograma recursivo F contiene una sentencia que invoca a F, mientras que en recursién indirecta el subprograma F invoca al subprograma & que invoca a su ver al subprograma P, y asf sucesi- vamente hasa que se invoca de nuevo al subprograma # Siuna funcién, procedimiento o método se invoca a s{ misma, el proceso se denomina recursién directa; si una funcién, procedimiento 0 método puede invocar a una segunda funcién, procedimiento 0 método que a su vez invoca a la primera, este proceso se conoce como recursién indirecta o mutua. Un requisito para que un algoritmo recursivo sea correcto es que no genere una secuencia infinita de lamadas sobre sf mismo, Cualquier algoritmo que genere una secuencia de este tipo no puede terminar nunca, En consecuen- cia, la definicién recursiva debe incluir un componente base (condicién de salida) en el que fn) se defina directa- mente (es decir, no recursivamente) para uno o més valores dem Debe existir una “forma de salir” de la secuencia de Iamadas recursivas. As{ en la funcidn f(n) = n! para n entero sin la condicién de salida base es fn) = J param < 1

You might also like