Está en la página 1de 10

Laboratorio 03 - Estructuras Discretas Funciones Recursivas en Python

UNIVERSIDAD CATÓLICA DE SANTA MARÍA


ESCUELA PROFESIONAL DE INGENIERÍA DE SISTEMAS

SESIÓN 03:

Funciones Recursivas en Python

I
OBJETIVOS

• Recursividad
• Algoritmos recursivos en Python

II
TEMAS A TRATAR

Recursividad
Algoritmos recursivos en Python

III
MARCO TEORICO

1. Recursividad

Se denomina llamada recursiva (o recursividad), a aquellas funciones que en su algoritmo,


hacen referencia sí misma.
En el fondo las llamadas recursivas generan una copia de la misma función y ella
permanece en memoria hasta que se logra retornar y entregar el valor respuesta desde el
fondo del llamado recursivo.
Estas llamadas recursivas suelen ser muy útiles en casos muy puntuales, pero debido a su
gran factibilidad de caer en iteraciones infinitas, deben extremarse las medidas preventivas
Carlo Corrales Delgado – Karim Guevara Puente de la Vega Pág 1
Laboratorio 03 - Estructuras Discretas Funciones Recursivas en Python

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()

2. Algoritmos recursivos en Python

Un ejemplo conocido es la definición recurrente de la función factorial n!:

Veamos cómo se usa esta definición para hallar el valor del factorial de 3:

Carlo Corrales Delgado – Karim Guevara Puente de la Vega Pág 2


Laboratorio 03 - Estructuras Discretas Funciones Recursivas en Python

Implementado en Python seria:

def factorial(nro):
if nro==0:
return 1
else:
return nro * factorial(nro-1)

Otros ejemplos de funciones y sucesiones matemáticas definidas de forma recursiva son:

• Sucesión de Fibonacci — f(0)= 1, f(1) = 1; f(n) = f(n-1) + f(n-2) para n ≥ 2.

def fibonacci(nro):
if nro==0:
return 1
elif nro==1:
return 1
else:
return fibonacci(nro-1)+fibonacci(nro-2)

• Números de Catalan — C(2n, n)/(n+1) osea

es decir, definido en términos recursivos:

def catalan(nro):
if nro==0:
return 1
else:
return 2*(2*nro-1)/(nro+1)*catalan(nro-1)

Carlo Corrales Delgado – Karim Guevara Puente de la Vega Pág 3


Laboratorio 03 - Estructuras Discretas Funciones Recursivas en Python

• 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

I. Probar los siguientes algoritmos recursivos, transformándolos a Python:

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.2 Programar un algoritmo recursivo que permita invertir un número. Primero


corregir para que invierta de verdad. Ejemplo: Entrada:8435 Salida:5348. Tip
n%10 = 5. n/10 = 843
1. int invertir (int n) {
2. if (n < 10) { //caso base
3. return n;
4. }
5. else {
6. return (n % 10) + invertir (n / 10) * 10;
7. }
8. }
Carlo Corrales Delgado – Karim Guevara Puente de la Vega Pág 4
Laboratorio 03 - Estructuras Discretas Funciones Recursivas en Python

1.3 Programar un algoritmo recursivo que permita sumar los dígitos de un número.
Ejemplo: Entrada:123 Resultado:6

1. int sumar_dig (int n) {


2. if (n == 0) { //caso base
3. return n;
4. }
5. else {
6. return sumar_dig (n / 10) + (n % 10);
7. }
8. }
1.4 Programar un algoritmo recursivo que permita hacer una multiplicación, utilizando
el método Ruso.

1. int mult_rusa(int A, int B) { ){


2. if(A==1){
3. return (B);
4. }
5. if(A%2!=0){
6. return (B+mult_rusa( A/2 , B*2));
7. }
8. else{
9. return(mult_rusa( A/2 , B*2));
10. }
11. }

1.5 Programar un algoritmo recursivo que permita sumar los elementos de un vector.

int suma_vec(int v [], int n) {


if (n == 0) {
return v [n];
}
else {
return suma_vec(v, n - 1) + v [n];
}
}

1.6 Programar un algoritmo recursivo que permita multiplicar los elementos de un vector.

int multiplicar (int vec [], int tam) {


if (tam == 0) {
return (vec [0]);
}
return (vec [tam] * multiplicar (vec, tam - 1));
}

Carlo Corrales Delgado – Karim Guevara Puente de la Vega Pág 5


Laboratorio 03 - Estructuras Discretas Funciones Recursivas en Python

1.7 Programar un algoritmo recursivo que calcule el Maximo comun divisor de dos
números.

int sacar_mcd(int a, int b) {


if(b==0) {
return a;
}
else {
return sacar_mcd(b, a % b);
}
}

1.8 Programar un algoritmo recursivo que determine si un número es positivo/negativo.


Primeramente corregirlo para que funcione como nos indica la lógica.

public boolean positivo(int n){


if(n<0)
return true;
else
return negativo(n);
}

public boolean negativo(int n){


if(n>0)
return false;
else
return positivo(n);
}

1.9 Programar un algoritmo recursivo que determine si un número es impar utilizando


recursividad cruzada.

public boolean par(int n){


if(n==0) {
return true;
}
else {
return impar(n-1);
}
}

public boolean impar(int n){


if(n==0) {
return false;
}
else {
return par(n-1);
}
Carlo Corrales Delgado – Karim Guevara Puente de la Vega Pág 6
Laboratorio 03 - Estructuras Discretas Funciones Recursivas en Python

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);
}

1.11 Programar un algoritmo recursivo que muestre el numero menor de un vector.

int menorvec (int x [], int n, int menor) {


if (n == 0) {
if (menor > x [n]) {
return x [0];
}
else {
return menor;
}
}
else{
if (menor > x [n]) {
return menorvec (x, n - 1, x [n]);
}
else {
return menorvec (x, n - 1, menor);
}
}
}

int mayorvec (int numeros [], int posicion) {


int aux;
if (posicion == 0) {
return numeros [posicion];
}
else {
aux = mayor (numeros, posicion - 1);
if (numeros [posicion] > aux){
return numeros [posicion];
}
else{
return mayor (numeros, posicion - 1);
}
}
Carlo Corrales Delgado – Karim Guevara Puente de la Vega Pág 7
Laboratorio 03 - Estructuras Discretas Funciones Recursivas en Python

2. Encontrar fuentes bibliográficas, libros y tutoriales sobre el tema. Buscar más ejemplos.
Leerlos y aprender de ellos.
V
EJERCICIOS

1. Transforma el siguiente algoritmo a un programa recursivo, para encontrar el elemento


mayor en la sucesion.
máx(s, n){
grande = s1
for i = 2 to n
if(si > grande)
grande = si
return grande
}

2. Implemente el siguiente algoritmo como un programa de busqueda de texto.


busca_texto(p, m, t, n){
for i = 1 to n − m + 1{
j=1 // i es el indice en t del primer caracter de
// la subcadena para comparar con p, y j es el indice en p

//el ciclo “while” compara ti...ti+m−1 y p1...pm


while (ti+j−1 == pj){
j=j+1
if(j > m)
return i
}
}
return 0
}

3. Implemente el siguiente algoritmo como un programa de insercion por orden.


inserción_por_orden(s, n) {
for i = 2 to n {
val = si // guarda si para insertarla en el lugar
// correcto
j=i−1 // si val < sj, se mueve sj a la derecha para
// dejar lugar a si
while(j≥1 ∧ val<sj){
sj+1 = sj
j=j−1
}
sj+1 = val // inserta val
}
}
Carlo Corrales Delgado – Karim Guevara Puente de la Vega Pág 8
Laboratorio 03 - Estructuras Discretas Funciones Recursivas en Python

4. Implemente el siguiente algoritmo como un programa para desordenar.


desordena(a, n){
for i = 1 to n − 1
swap(ai, arand(i,n))
}

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

1. ¿Cómo funcionan los algoritmos recursivos en Python?


2. ¿Cuáles son las principales ventajas de la programación recursiva en Python?
3. ¿Cuál es tu opinión sobre la importancia de la programación recursiva?

Carlo Corrales Delgado – Karim Guevara Puente de la Vega Pág 9


Laboratorio 03 - Estructuras Discretas Funciones Recursivas en Python

VII
BIBLIOGRAFIA Y REFERENCIAS

JOHNSONBAUGH, R. Matemáticas Discretas. México. Pearson. 6ta Ed. 2005


LEE KENT D. Python programming fundamentals. New York. Springer Verlag. 2011.
GORVATOV V.A. Fundamentos de la Matemática Discreta. Rusia. Edit. Mir Moscu. 1988.
Documentación Python 2.7.9 Tutorial de Python. www.python.org

Carlo Corrales Delgado – Karim Guevara Puente de la Vega Pág 10

También podría gustarte