Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Practica03 2
Practica03 2
Objetivo:
Introducción:
La recursividad es en técnica para dar solución a problemas grandes. La idea básica es, dado un problema,
resolver una parte más sencilla del mismo y con esta solución, resolver un problema más complicado; es
decir, ir resolviendo problemas de menor complejidad que puedan ser la solución de problemas de mayor
complejidad. Es importante mencionar que, la recursividad no es dividir un problema en tareas, más bien
se trata de reducir la complejidad del mismo y a partir de esto, resolver un problema más complicado. Por
ejemplo, consideremos el factorial de un número N (expresado como N!) el cual puede resolverse de la
siguiente forma:
Si comparamos el Código 1 con el 2, en el fondo tenemos el mismo problema, pero, al dividir el proceso
en dos ciclos, estos se podrían ejecutar de forma paralela y por lo tanto consumir menos tiempo. Sin
embargo, no todos los procesos pueden ejecutarse de manera paralela.
Pensemos ahora en otra forma de obtener una solución. El primer paso es determinar el conjunto de
posibles valores de entrada; en este caso, estamos pensando en que N ≥ 0. Conociendo la entrada, se
podrían explorar aquellos valores de entrada que pueden ser resueltos de forma sencilla, al conjunto de
datos de entrada, a cada valor de N en nuestro ejemplo, lo llamaremos caso. Por ejemplo, para el caso N
= 0 se tiene 0! = 1 (por definición), el siguiente caso 1! = 1, 2! = 2*1, 3! = 3*2*1 = 6, 4! = 4*3*2*1 = 24, etc.
Notamos que, es posible usar los resultados del caso previo para encontrar el resultado del siguiente caso,
por ejemplo, conociendo 3! se puede obtener 4!.
Para el problema del factorial, los casos más sencillos suceden para valores pequeños de N, en específico
cuando N = 0 o 1. Estos casos se denominan casos base y corresponden a la menor cantidad de operaciones
a realizar para dar solución. Entonces, si a partir del caso anterior, es posible obtener el resultado del
siguiente caso, entonces decimos que es posible resolver el problema de forma o manera recursiva. Si por
algún medio, conocemos el valor de (N-1)! entonces fácilmente podremos conocer el valor de N!, ya que
N! = N*(N-1!).
En ocasiones podría no ser evidente una solución mediante recursividad, pero en otras, podría ser muy
intuitivo. A nivel computacional, a cuando una solución recursiva sea muy intuitiva, no significa que la
mejor solución; podrían existir otras soluciones más eficientes pero tal vez más complejas de desarrollar.
Una implementación recursiva del factorial es la siguiente:
En donde word representa un tipo de dato entero largo. Nótese en el código anterior, que se han separado
los casos base y, cuando no se trata del caso base, entonces “suponemos que”, conocemos el factorial del
siguiente caso para obtener el resultado del caso presente.
Desarrollo:
1. Implemente los Códigos 1 y 2 y determine los tiempos de ejecución de ambos para valores de N
relativamente grandes, grafique los tiempos. Dado que el factorial de un número dado podría ser
muy grande, se recomienda que investigue algunos tipos de datos apropiados, por ejemplo, podría
experimentar con los tipos double, float o long long. Para pueda darse una idea, un tipo de dato
entero de 64 bits, solo permitiría obtener el factorial de 21, más allá de ese número, el resultado
no sería correcto.
2. Determine los tiempos de ejecución de cada código, grafíquelos y compárelos con el
comportamiento de los tiempos de ejecución de la actividad anterior. Note que, uno de los
tiempos es una función recursiva que tendrá que resolver.
Entregable: Deberá entregar una documentación de no más de 5 cuartillas. No es necesario que entregue
una portada, con que en la parte superior coloque el número de práctica, su nombre y matricula será
suficiente. Las secciones del reporte que deberá entregar son:
Deberá subir a la plataforma su reporte en PDF y códigos fuente que se hayan generado, envíelos
comprimidos en ZIP. El nombre del reporte y del archivo comprimido DEBERA SER UNICAMENTE SU
NÚMERO DE MATRÍCULA.