Documentos de Académico
Documentos de Profesional
Documentos de Cultura
SESIÓN 03:
I
OBJETIVOS
• Recursividad
• Algoritmos recursivos en Python
II
TEMAS A TRATAR
Recursividad
Algoritmos recursivos en Python
III
MARCO TEORICO
1. Recursividad
adecuadas y, solo utilizarse cuando sea estrictamente necesario y no exista una forma
alternativa viable, que resuelva el problema evitando la recursividad.
Python admite las llamadas recursivas, permitiendo a una función, llamarse a sí misma, de
igual forma que lo hace cuando llama a otra función.
Normalmente la forma cómo se controla el llamado recursivo es especificar la condición
base dentro de un condicional, para que llegado cierto momento, ya no se realice el llamado
recursivo y se inicie el retorno o salida desde el fondo de la recursividad, entregando la
respuesta final esperada.
El manejo de variables contadoras en los algoritmos recursivos se hace solamente a través
de los parámetros de entrada, puesto que no se puede manejar variables simples como en
funciones no recursivas. Así, para contar se deberá enviar el contador como un parámetro
de entrada más en la función recursiva.
def jugar(intento=1):
respuesta = raw_input("¿De qué color es una naranja? ")
if respuesta != "naranja":
if intento < 3:
print "\nFallaste! Inténtalo de nuevo"
intento += 1
jugar(intento) # Llamada recursiva
else:
print "\nPerdiste!"
else:
print "\nGanaste!"
jugar()
Veamos cómo se usa esta definición para hallar el valor del factorial de 3:
def factorial(nro):
if nro==0:
return 1
else:
return nro * factorial(nro-1)
def fibonacci(nro):
if nro==0:
return 1
elif nro==1:
return 1
else:
return fibonacci(nro-1)+fibonacci(nro-2)
def catalan(nro):
if nro==0:
return 1
else:
return 2*(2*nro-1)/(nro+1)*catalan(nro-1)
• Función de Ackermann
def ackermann(m,n):
if m==0:
return n+1
elif m>0 and n==0:
return ackermann(m-1,1)
else:
return ackermann(m-1,ackermann(m,n-1))
IV
(La práctica tiene una duración de 4 horas) ACTIVIDADES
1.1 Programar un algoritmo recursivo que permita hacer la división por restas
sucesivas.
1. int division (int a, int b) {
2. if(b > a) {
3. return 0;
4. }
5. else {
6. return division(a-b, b) + 1;
7. }
8. }
1.3 Programar un algoritmo recursivo que permita sumar los dígitos de un número.
Ejemplo: Entrada:123 Resultado:6
1.5 Programar un algoritmo recursivo que permita sumar los elementos de un vector.
1.6 Programar un algoritmo recursivo que permita multiplicar los elementos de un vector.
1.7 Programar un algoritmo recursivo que calcule el Maximo comun divisor de dos
números.
1.10 Programar un algoritmo recursivo que permita sumar los elementos de una matriz.
int suma (int fila, int col, int orden, int mat [] [])
{
if (fila == 0 && col == 0)
return mat [0] [0];
else
if (col < 0)
return suma (fila - 1, orden, orden, mat);
else
return mat [fila] [col] + suma (fila, col - 1, orden, mat);
}
2. Encontrar fuentes bibliográficas, libros y tutoriales sobre el tema. Buscar más ejemplos.
Leerlos y aprender de ellos.
V
EJERCICIOS
5. Corra el algoritmo anterior “desordena” (del ejercicio 4) muchas veces para la misma
sucesion de entrada. ¿Como puede analizarse la salida para determinar si es
verdaderamente “aleatorio”?
6. Implemente la seleccion por orden como un programa: El algoritmo de selección por
orden acomoda la sucesion s1, . . . , sn en orden no decreciente, para ello encuentra
primero el elemento mas pequeñ o, por ejemplo si, y lo coloca en el primer lugar inter-
cambiando s1 y si. Despues encuentra el algoritmo mas pequeñ o en s2, . . . , sn, de nuevo
digamos si, y lo coloca en el segundo lugar intercambiando s2 y si. Continua hasta que la
sucesion este ordenada.
7. Compare los tiempos de corrida de insercion por orden (del ejercicio 3) y seleccion por
orden (del ejercicio 7) para varias entradas de tamañ os diferentes. Incluya datos en
orden no decreciente, en orden no creciente, datos que contienen muchos duplicados y
datos en orden aleatorio.
8. Escriba un programa recursivo y otro no recursivo para calcular n!. Compare los
tiempos requeridos por los programas.
9. Escriba un programa recursivo y otro no recursivo para calcular la sucesion de
Fibonacci. Compare los tiempos requeridos por los programas.
10. Un robot puede dar pasos de 1 o 2 metros. Escriba un programa para numerar todas las
maneras en que el robot camina n metros.
11. Un robot puede dar pasos de 1, 2 o 3 metros. Escriba un programa para numerar todas
las maneras en que el robot camina n metros.
12. Implemente un programa recursivo que calcule la potencia de un numero elevado a
otro. Sabemos que 2n = 2n/2. 2n/2 donde n es un nro par; y 2n = 2(n-1)/2. 2(n-1)/2.2 si n es
impar.
13. Implemente un programa recursivo que sume dos numeros a + b. Considera que la suma
a+b = a + 1 + 1 + …+ 1 (b veces)
VI
CUESTIONARIO
VII
BIBLIOGRAFIA Y REFERENCIAS