tema 1:introducción /recursiónpepe/doc/adsw/tema1/021_recursion.pdf · análisis y diseño de...
TRANSCRIPT
![Page 1: Tema 1:Introducción /recursiónpepe/doc/adsw/tema1/021_recursion.pdf · Análisis y diseño de software dit UPM Tema 1:Introducción /recursión José A. Mañas pepe/doc/adsw/index.html](https://reader036.vdocuments.site/reader036/viewer/2022081407/604bda1a0c72fb1f67766f34/html5/thumbnails/1.jpg)
Análisis y diseño de software ditUPM
Tema 1: Introducción/recursión
José A. Mañas
http://jungla.dit.upm.es/~pepe/doc/adsw/index.html
13.2.2018
![Page 2: Tema 1:Introducción /recursiónpepe/doc/adsw/tema1/021_recursion.pdf · Análisis y diseño de software dit UPM Tema 1:Introducción /recursión José A. Mañas pepe/doc/adsw/index.html](https://reader036.vdocuments.site/reader036/viewer/2022081407/604bda1a0c72fb1f67766f34/html5/thumbnails/2.jpg)
índice
• concepto: recursión
– forma de resolver un problema recurriendo a unaversión más simple de sí mismo
• eficiencia
• fallos típicos
recursión 2
![Page 3: Tema 1:Introducción /recursiónpepe/doc/adsw/tema1/021_recursion.pdf · Análisis y diseño de software dit UPM Tema 1:Introducción /recursión José A. Mañas pepe/doc/adsw/index.html](https://reader036.vdocuments.site/reader036/viewer/2022081407/604bda1a0c72fb1f67766f34/html5/thumbnails/3.jpg)
recursión
• suma de una serie aritmética
– S(a, k, n)= a, a+k, a+2k, a+3k, …, a+nk
– S(a, k, 0) = a
– S(a, k, n) = S(a, k, n-1) + a+nk
recursión 3
public int suma(int n) {if (n == 0)
return a;else
return suma(n - 1) + a + n * k;}
![Page 4: Tema 1:Introducción /recursiónpepe/doc/adsw/tema1/021_recursion.pdf · Análisis y diseño de software dit UPM Tema 1:Introducción /recursión José A. Mañas pepe/doc/adsw/index.html](https://reader036.vdocuments.site/reader036/viewer/2022081407/604bda1a0c72fb1f67766f34/html5/thumbnails/4.jpg)
recursión
recursión
• Algoritmos que se resuelven recurriendo a un subproblema similar más simple
– similares a las pruebas por inducción
• Necesitan
– una condición de parada
– converger en cada paso hacia la parada
• Ventaja
– en muchos problemas la corrección del algoritmo es evidente
4
![Page 5: Tema 1:Introducción /recursiónpepe/doc/adsw/tema1/021_recursion.pdf · Análisis y diseño de software dit UPM Tema 1:Introducción /recursión José A. Mañas pepe/doc/adsw/index.html](https://reader036.vdocuments.site/reader036/viewer/2022081407/604bda1a0c72fb1f67766f34/html5/thumbnails/5.jpg)
anatomía de un método java
recursión 5
double distancia (Punto q)
{
double dx= x – q.getX();
double dy= y – q.getY();
return Math.sqrt(dx*dx + dy*dy);
}
nombretipo del
resultadoargumentos
variables
locales
resultado
final
cuerpo
cabecera
![Page 6: Tema 1:Introducción /recursiónpepe/doc/adsw/tema1/021_recursion.pdf · Análisis y diseño de software dit UPM Tema 1:Introducción /recursión José A. Mañas pepe/doc/adsw/index.html](https://reader036.vdocuments.site/reader036/viewer/2022081407/604bda1a0c72fb1f67766f34/html5/thumbnails/6.jpg)
ejemplo
recursión 6
public class Palindromo {public static boolean check(String s) {
return check(s, 0, s.length() - 1);}
private static boolean check(String s, int a, int z) {if (a >= z)
return true;if (s.charAt(a) != s.charAt(z))
return false;return check(s, a + 1, z - 1);
}
set up
condiciones de terminación
paso de recursión
![Page 7: Tema 1:Introducción /recursiónpepe/doc/adsw/tema1/021_recursion.pdf · Análisis y diseño de software dit UPM Tema 1:Introducción /recursión José A. Mañas pepe/doc/adsw/index.html](https://reader036.vdocuments.site/reader036/viewer/2022081407/604bda1a0c72fb1f67766f34/html5/thumbnails/7.jpg)
argumentos y variables locales
• Se crean con la llamada
• Desaparecen al acabar
• Si hay varias llamadas simultáneas,
– cada llamada tiene sus variables propias
recursión 7
![Page 8: Tema 1:Introducción /recursiónpepe/doc/adsw/tema1/021_recursion.pdf · Análisis y diseño de software dit UPM Tema 1:Introducción /recursión José A. Mañas pepe/doc/adsw/index.html](https://reader036.vdocuments.site/reader036/viewer/2022081407/604bda1a0c72fb1f67766f34/html5/thumbnails/8.jpg)
factorial recursivo
– int factorial (int n) {if (n < 1) return 1; return n * factorial(n-1);
}
• Hay que cerciorarse de que no es uncírculo vicioso
– int factorial (int n) {if (n == 0) return 1; return n * factorial(n-1);
}
recursión 8
n! = n * (n-1)!
![Page 9: Tema 1:Introducción /recursiónpepe/doc/adsw/tema1/021_recursion.pdf · Análisis y diseño de software dit UPM Tema 1:Introducción /recursión José A. Mañas pepe/doc/adsw/index.html](https://reader036.vdocuments.site/reader036/viewer/2022081407/604bda1a0c72fb1f67766f34/html5/thumbnails/9.jpg)
factorial recursivo
recursión 9
![Page 10: Tema 1:Introducción /recursiónpepe/doc/adsw/tema1/021_recursion.pdf · Análisis y diseño de software dit UPM Tema 1:Introducción /recursión José A. Mañas pepe/doc/adsw/index.html](https://reader036.vdocuments.site/reader036/viewer/2022081407/604bda1a0c72fb1f67766f34/html5/thumbnails/10.jpg)
recursión
factorial recursivo
factorial (3)
return 3 *
factorial (2)
return 2 *
factorial (1)
return 1 *
factorial (0)
return 1
en cada llamadatenemos variables localesindependientes
10
![Page 11: Tema 1:Introducción /recursiónpepe/doc/adsw/tema1/021_recursion.pdf · Análisis y diseño de software dit UPM Tema 1:Introducción /recursión José A. Mañas pepe/doc/adsw/index.html](https://reader036.vdocuments.site/reader036/viewer/2022081407/604bda1a0c72fb1f67766f34/html5/thumbnails/11.jpg)
eficiencia
• sin dudar de que efectivamente se encuentrela solución,
• la eficiencia del proceso se ve perjudicada porla necesidad de mantener información del estado previo para poder regresar trasresolver el subproblema más sencillo
recursión 11
![Page 12: Tema 1:Introducción /recursiónpepe/doc/adsw/tema1/021_recursion.pdf · Análisis y diseño de software dit UPM Tema 1:Introducción /recursión José A. Mañas pepe/doc/adsw/index.html](https://reader036.vdocuments.site/reader036/viewer/2022081407/604bda1a0c72fb1f67766f34/html5/thumbnails/12.jpg)
recursión iteración
• puede ser fácil pasar a iteración
• tail recursión: lo último que se hace esllamarse a sí mismo y no hay que conservar el estado anterior
recursión 12
private static boolean checki(String s, int a, int z) {while (a < z) {
if (s.charAt(a) != s.charAt(z))return false;
a++;z--;
}return true;
}
![Page 13: Tema 1:Introducción /recursiónpepe/doc/adsw/tema1/021_recursion.pdf · Análisis y diseño de software dit UPM Tema 1:Introducción /recursión José A. Mañas pepe/doc/adsw/index.html](https://reader036.vdocuments.site/reader036/viewer/2022081407/604bda1a0c72fb1f67766f34/html5/thumbnails/13.jpg)
factorial iterativo
• ¿Usa menos memoria? probablemente
• ¿Tarda menos? Hay que medirlo
recursión
public int metodo2(int n) {
int resultado = 1;
for (int i = 1; i <= n; i++)
resultado *= i;
return resultado;
}
13
![Page 14: Tema 1:Introducción /recursiónpepe/doc/adsw/tema1/021_recursion.pdf · Análisis y diseño de software dit UPM Tema 1:Introducción /recursión José A. Mañas pepe/doc/adsw/index.html](https://reader036.vdocuments.site/reader036/viewer/2022081407/604bda1a0c72fb1f67766f34/html5/thumbnails/14.jpg)
recursión
¿recursión o iteración?
• Son dos formas de conseguir que un programa haga muchas veces lo mismo con alguna variante
• Toda iteración puede pasar a recursión
– todo bucle puede convertirse en un método que se llama a sí mismo
– normalmente es fácil de programar
• Toda recursión puede pasar a iteración
– todo método recursivo se puede escribir como bucle
– puede ser difícil de programar
14
![Page 15: Tema 1:Introducción /recursiónpepe/doc/adsw/tema1/021_recursion.pdf · Análisis y diseño de software dit UPM Tema 1:Introducción /recursión José A. Mañas pepe/doc/adsw/index.html](https://reader036.vdocuments.site/reader036/viewer/2022081407/604bda1a0c72fb1f67766f34/html5/thumbnails/15.jpg)
recursión
iteración recursión
while (p) { x; } void metodo(...) {
if (p) {
x;
metodo(...);
}
}
15
variables = valor inicial;
while (p(variables)) {
modifica_variables();
}
return variable final
void metodo(variables) {
if (p(variables)) {
modifica_variables();
return metodo(variables);
}
return variable final
}
![Page 16: Tema 1:Introducción /recursiónpepe/doc/adsw/tema1/021_recursion.pdf · Análisis y diseño de software dit UPM Tema 1:Introducción /recursión José A. Mañas pepe/doc/adsw/index.html](https://reader036.vdocuments.site/reader036/viewer/2022081407/604bda1a0c72fb1f67766f34/html5/thumbnails/16.jpg)
serie de fibonacci
• Leonardo de Pisa, filius Bonacci, (1202)
• 0 1 1 2 3 5 8 13 21 34 55 89 144 ...
• f(n) = f(n-1) + f(n-2)f(0) = 0f(1) = 1
recursión 16
![Page 17: Tema 1:Introducción /recursiónpepe/doc/adsw/tema1/021_recursion.pdf · Análisis y diseño de software dit UPM Tema 1:Introducción /recursión José A. Mañas pepe/doc/adsw/index.html](https://reader036.vdocuments.site/reader036/viewer/2022081407/604bda1a0c72fb1f67766f34/html5/thumbnails/17.jpg)
programación
recursión
int fibo(int n) {
if (n < 1)
return 0;
if (n == 1)
return 1;
return fibo(n - 1) + fibo(n - 2);
}
17
int fibo(int n) {
if (n < 1)
return 0;
int f0 = 0;
int f1 = 1;
for (int i = 2; i <= n; i++) {
int fn = f0 + f1;
f0 = f1;
f1 = fn;
}
return f1;
}
recursivo iterativo
![Page 18: Tema 1:Introducción /recursiónpepe/doc/adsw/tema1/021_recursion.pdf · Análisis y diseño de software dit UPM Tema 1:Introducción /recursión José A. Mañas pepe/doc/adsw/index.html](https://reader036.vdocuments.site/reader036/viewer/2022081407/604bda1a0c72fb1f67766f34/html5/thumbnails/18.jpg)
ventajas colaterales
recursión 18
int min(int[] data) {return min(data, 0, data.length);
}
int min(int[] data, int a, int z) {if (z - a < N)
return min1(data, a, z);int m = (a + z) / 2;int m1 = min(data, a, m);int m2 = min(data, m, z);if (m1 < m2)
return m1;else
return m2;}
int min1(int[] data, int a, int z) {int m = data[a];for (int i = a + 1; i < z; i++) {
int x = data[i];if (x < m)
m = x;}return m;
}
![Page 19: Tema 1:Introducción /recursiónpepe/doc/adsw/tema1/021_recursion.pdf · Análisis y diseño de software dit UPM Tema 1:Introducción /recursión José A. Mañas pepe/doc/adsw/index.html](https://reader036.vdocuments.site/reader036/viewer/2022081407/604bda1a0c72fb1f67766f34/html5/thumbnails/19.jpg)
fallos típicos
• que la condición de terminación de pase por alto
– ej. igualdad con reales
– conviene poner condiciones “embudo”
• que los valores no converjan a la situación de parada
• usar variables de clase (static)de las que hay 1 para todas las llamadas: CAOS
recursión 19
![Page 20: Tema 1:Introducción /recursiónpepe/doc/adsw/tema1/021_recursion.pdf · Análisis y diseño de software dit UPM Tema 1:Introducción /recursión José A. Mañas pepe/doc/adsw/index.html](https://reader036.vdocuments.site/reader036/viewer/2022081407/604bda1a0c72fb1f67766f34/html5/thumbnails/20.jpg)
ejercicio 1
• repeated squaring
recursión 20
https://en.wikipedia.org/wiki/Exponentiation_by_squaring
![Page 21: Tema 1:Introducción /recursiónpepe/doc/adsw/tema1/021_recursion.pdf · Análisis y diseño de software dit UPM Tema 1:Introducción /recursión José A. Mañas pepe/doc/adsw/index.html](https://reader036.vdocuments.site/reader036/viewer/2022081407/604bda1a0c72fb1f67766f34/html5/thumbnails/21.jpg)
ejercicio 2
Función de Ackermann
• A(m, n) =n+1 si m = 0A(m-1, 1) si m > 0 & n = 0A(m-1, A(m, n-1)) si m > 0 & n > 0
• ejemplos
java 21
A(0, 0) = 1 A(0, 1) = 2 A(0, 2) = 3 A(0, 5) = 4 A(0, 4) = 5
A(1, 0) = 2 A(1, 1) = 3 A(1, 2) = 4 A(1, 3) = 5 A(1, 4) = 6
A(2, 0) = 3 A(2, 1) = 5 A(2, 2) = 7 A(2, 3) = 9 A(2, 4) = 11
A(3, 0) = 5 A(3, 1) = 13 A(3, 2) = 29 A (3, 3) = 61 A(3, 4) = 125
https://en.wikipedia.org/wiki/Ackermann_function
![Page 22: Tema 1:Introducción /recursiónpepe/doc/adsw/tema1/021_recursion.pdf · Análisis y diseño de software dit UPM Tema 1:Introducción /recursión José A. Mañas pepe/doc/adsw/index.html](https://reader036.vdocuments.site/reader036/viewer/2022081407/604bda1a0c72fb1f67766f34/html5/thumbnails/22.jpg)
ejercicio 3 (Euclides)
• máximo común divisor recursivo e iterativo
• gcd(a, b) =
– gcd(b, a) si a < b
– a si b = 0
– gcd(b, a%b) si a > b
java 22
![Page 23: Tema 1:Introducción /recursiónpepe/doc/adsw/tema1/021_recursion.pdf · Análisis y diseño de software dit UPM Tema 1:Introducción /recursión José A. Mañas pepe/doc/adsw/index.html](https://reader036.vdocuments.site/reader036/viewer/2022081407/604bda1a0c72fb1f67766f34/html5/thumbnails/23.jpg)
ejercicio 4.1
• torres de hanoi
• hay que mover N discos de la torre A a la torre B de forma que
– sólo se puede mover un disco cada vez
– nunca puede haber un disco de mayor tamaño sobre otro de menor tamaño
– se puede usar una torre C auxiliar
22.12.2010 23
![Page 24: Tema 1:Introducción /recursiónpepe/doc/adsw/tema1/021_recursion.pdf · Análisis y diseño de software dit UPM Tema 1:Introducción /recursión José A. Mañas pepe/doc/adsw/index.html](https://reader036.vdocuments.site/reader036/viewer/2022081407/604bda1a0c72fb1f67766f34/html5/thumbnails/24.jpg)
ejercicio 4.2
• solución
22.12.2010 24
![Page 25: Tema 1:Introducción /recursiónpepe/doc/adsw/tema1/021_recursion.pdf · Análisis y diseño de software dit UPM Tema 1:Introducción /recursión José A. Mañas pepe/doc/adsw/index.html](https://reader036.vdocuments.site/reader036/viewer/2022081407/604bda1a0c72fb1f67766f34/html5/thumbnails/25.jpg)
ejercicio 4.3
• programarmueve(int n, int A, int B, int C)
• si n = 1, se mueve 1 de A a B
• si n > 1
1. se mueven n-1 de A a C
2. se mueve 1 de A a B
3. se mueven n-1 de C a B
22.12.2010 25
![Page 26: Tema 1:Introducción /recursiónpepe/doc/adsw/tema1/021_recursion.pdf · Análisis y diseño de software dit UPM Tema 1:Introducción /recursión José A. Mañas pepe/doc/adsw/index.html](https://reader036.vdocuments.site/reader036/viewer/2022081407/604bda1a0c72fb1f67766f34/html5/thumbnails/26.jpg)
ejercicio 5
• Binary search begins by comparing the middle element of the array with the target value. If the target value matches the middle element, its position in the array is returned. If the target value is less than or greater than the middle element, the search continues in the lower or upper half of the array, respectively, eliminating the other half from consideration.
java 26
https://en.wikipedia.org/wiki/Binary_search_algorithm
![Page 27: Tema 1:Introducción /recursiónpepe/doc/adsw/tema1/021_recursion.pdf · Análisis y diseño de software dit UPM Tema 1:Introducción /recursión José A. Mañas pepe/doc/adsw/index.html](https://reader036.vdocuments.site/reader036/viewer/2022081407/604bda1a0c72fb1f67766f34/html5/thumbnails/27.jpg)
ejercicio 6
• dadas 2 listas ordenadas de String,combinarlas respetando el orden
• List<String> merge(List<String>, List<String> b)
java 27
https://en.wikipedia.org/wiki/Merge_sort