Programación I Capítulo 3 Recursividad
Programación I Capítulo 3 Recursividad
Programación I Capítulo 3 Recursividad
Recursividad
Dra. Tania Calle Jiménez
2021B
tania.calle@epn.edu.ec
Funciones: Recursividad
• n! = n * (n – 1)!
Forma iteractiva
• int factorial(int n)
• { int i, fact = 1;
• for (i=2; i<=n; i++)
• fact = fact * i;
• return(fact); }
• /* Función recursiva para cálculo de factoriales */
• int factorial(int n)
• { if(n < 0)
• return 0;
• else if(n > 1)
• return n*factorial(n-1); /* Recursividad */
• return 1; /* Condición de terminación, n == 1 */ }
• Veamos paso a paso, lo que pasa cuando se
ejecuta esta función, por ejemplo: factorial(4):
– 1a Instancia
n=4
n>1
salida ← 4 * factorial(3) (Guarda el valor de n = 4)
• 2a Instancia
n>1
salida ← 3*factorial(2) (Guarda el valor de n = 3)
– 3a Instancia
n>1
salida ← 2*factorial(1) (Guarda el valor de n = 2)
» 4a Instancia
n == 1 → retorna 1
– 3a Instancia
(recupera n=2 de la pila) retorna 1*2=2
• 2a instancia
(recupera n=3 de la pila) retorna 2*3=6
– 1a instancia
(recupera n=4 de la pila) retorna 6*4=24
Valor de retorno → 24
• Hay algunas limitaciones:
– No es posible calcular el factorial de números
negativos, no está definido.
– El factorial de cero es 1.
– De modo que una función bien hecha para cálculo
de factoriales debería incluir un control para esos
casos:
• Aunque la función factorial es un buen ejemplo
para demostrar cómo funciona una función
recursiva, la recursividad no es un buen modo
de resolver esta función, que sería más sencilla
y rápida con un simple bucle for.
• La recursividad consume muchos recursos de
memoria y tiempo de ejecución, y se debe
aplicar a funciones que realmente le saquen
partido.
Ventajas de la Recursión
• Soluciones simples, claras.
• Soluciones elegantes.
• Soluciones a problemas complejos.
Desventajas de la Recursión
• int par(int n)
• { if (n == 0)
• return 1; /* es par */
• else
• return impar(n-1); }
• int impar(int n)
• { if (n == 0)
• return 0; /* es impar */
• else
• return par(n-1); }
• La función par ( ) llama a la función impar ( ) ,
ésta a su vez llama a la función par ( ) . La
condición para terminar de hacer llamadas es
que n sea cero; el cero se considera par.
• De manera similar a como se definió
recursivamente el operador módulo es posible
definir el operador para división entera, es decir,
división sobre operandos enteros y cuyo
resultado es entero (se ignoran los decimales).
• Como ejercicio la definición recursiva de este
operador y la implementación de la función en C
correspondiente. Como programa de prueba
puede emplearse el mismo que se empleó para el
módulo con unos pocos cambios.
• 1.- Programa en C que calcula el producto de dos
números de forma recursiva. Los números a multiplicar
se leen por teclado.