Beruflich Dokumente
Kultur Dokumente
PROGRAMACIÓN
Clase 7
Recursión
• Recursión
• Función recursiva
• Pila de ejecución
Recursión
• Es una técnica que permite definir problemas en términos
de si mismo
Caso recursivo:
La función se invoca a si
misma para poder devolver
un resultado.
Recursión - Ejemplo
int sumar (int n){
if (n == 1)
return n;
else
return n + sumar(n-1);
}
Caso base:
La función finaliza con las
llamadas recursivas.
Recursión - Ejemplo
int sumar (int n){
if (n == 1)
return n;
else
return n + sumar(n-1);
}
La función se invoca a si
misma con el valor 4.
n=5
Pila de ejecución
int sumar (int n){
if (n == 1)
return n;
else
return n + sumar(n-1);
}
Nuevamente la función se
n=4
invoca a si misma
n=5
Pila de ejecución
int sumar (int n){
if (n == 1)
return n;
else
return n + sumar(n-1);
}
n=3
n=4
Una nueva reserva de
memoria
n=5
Pila de ejecución
int sumar (int n){
if (n == 1)
return n;
else
return n + sumar(n-1);
}
n=3
Nuevamente la función se
n=4
invoca a si misma
n=5
Pila de ejecución
int sumar (int n){
if (n == 1)
return n;
else
return n + sumar(n-1);
} n=2
n=3
n=4
Una nueva reserva de
memoria
n=5
Pila de ejecución
int sumar (int n){
if (n == 1)
return n;
else
return n + sumar(n-1);
} n=2
n=3
Nuevamente la función se
n=4
invoca a si misma
n=5
Pila de ejecución
int sumar (int n){
if (n == 1)
return n;
else
n=1
return n + sumar(n-1);
} n=2
n=3
n=4
Una nueva reserva de
memoria
n=5
Pila de ejecución
int sumar (int n){
if (n == 1)
return n;
else
n=1
return n + sumar(n-1);
} n=2
n=3
n=4
¿Qué sucede cuando n vale 1?
n=5
Pila de ejecución
int sumar (int n){
if (n == 1)
return n;
else
n=1
return n + sumar(n-1);
} n=2
n=3
n=4
Se ejecuta el caso base.
Finaliza las llamadas recursivas
n=5
Al finalizar se libera la memoria
Pila de ejecución reservada para su ejecución.
if (n == 1)
return n; 1
else
return n + sumar(n-1);
} n=2
n=3
n=3
n=3
n=5
Pila de ejecución
int sumar (int n){
if (n == 1)
return n; 1
else
return n + sumar(n-1);
} n=2
n=3
else
return n + sumar(n-1); 3
}
n=3
return n;
else
return n + sumar(n-1); n=3
}
6
return n + sumar(n-1);
}
n=4
10
En este estado n vale 4, se le
suma 6 (el valor recibido como
resultado) y se devuelve la suma
4 + 6 = 10 n=5
Pila de ejecución
int sumar (int n){
if (n == 1)
return n;
else 10
return n + sumar(n-1);
}
n=5
15
En este estado n vale 5, se le
suma 10 (el valor recibido como
resultado) y se devuelve la suma
5 + 10 = 15
Pila de ejecución
int sumar (int n){
if (n == 1)
return n;
else 10
return n + sumar(n-1);
}
n=5
LetraMovida = 'R'
Resto = "ECURSION"
R
Recursión – Ejemplo
R E C U R S I O N
LetraMovida = 'R'
Resto = "ECURSION"
R
Recursión – Ejemplo
R E C U R S I O N
LetraMovida = 'E'
Resto = "CURSION"
E R
Recursión – Ejemplo
R E C U R S I O N
LetraMovida = 'E'
Resto = "CURSION"
E R
Recursión – Ejemplo
R E C U R S I O N
LetraMovida = 'C'
Resto = "URSION"
C E R
Recursión – Ejemplo
R E C U R S I O N
LetraMovida = 'C'
Resto = "URSION"
C E R
Recursión – Ejemplo
R E C U R S I O N
N O I S R U C E R
Recursión – Ejemplo
R E C U R S I O N
Estado 10
El caso base (string vacío) devuelve el
propio string vacío.
Caso base
N O I S R U C E R
Recursión – Ejemplo
R E C U R S I O N
Estado 9
Esta llamada concatena el string recibido
con la letra que estaba moviendo.
LetraMovida = 'N'
Resto = ""
StringRecibido = ""
N O I S R U C E R
Recursión – Ejemplo
R E C U R S I O N
Estado 8
Esta llamada concatena el string recibido
con la letra que estaba moviendo.
LetraMovida = 'O'
Resto = "N"
StringRecibido = "N"
N O I S R U C E R
Recursión – Ejemplo
R E C U R S I O N
Estado 8
Esta llamada concatena el string recibido
con la letra que estaba moviendo.
LetraMovida = 'I'
Resto = "ON"
StringRecibido = "NO"
N O I S R U C E R
Recursión – Ejemplo
R E C U R S I O N
Estado 1
N O I S R U C E R
Recursión – Ejemplo
string invertir(string cadena){
if (cadena == "")
return "";
else {
char letra = cadena[0];
string resto = cadena.Substring(1);
return invertir(resto) + letra;
}
}
Recursión – Ejemplo
string invertir(string cadena){
if (cadena == "") Caso base: string
return ""; vacío
else {
char letra = cadena[0];
string resto = cadena.Substring(1);
return invertir(resto) + letra;
}
}
Recursión – Ejemplo
string invertir(string cadena){
Guardamos la
if (cadena == "") primer letra
return "";
else {
char letra = cadena[0];
string resto = cadena.Substring(1);
return invertir(resto) + letra;
}
}
Recursión – Ejemplo
string invertir(string cadena){
Obtenemos el
if (cadena == "") resto del string
return "";
else {
char letra = cadena[0];
string resto = cadena.Substring(1);
return invertir(resto) + letra;
}
}
Recursión – Ejemplo
string invertir(string cadena){
if (cadena == "")
return "";
else {
char letra = cadena[0];
string resto = cadena.Substring(1);
return invertir(resto) + letra;
}
} El string resto se invierte
de forma recursiva, el
string invertido se
concatena con la primer
letra poniendo a ésta al
final del string.
Recursión
• Ventajas
• Soluciones simples y claras
• Soluciones elegantes
• Soluciones a problemas complejos
• Desventajas
• Manejo ineficiente de memoria
• Una misma solución podría calcularse más de una vez (serie de
Fibonacci)