eliminacionrecursividadredundante
DESCRIPTION
Permite eliminar la recursividad en sus programasTRANSCRIPT
![Page 1: EliminacionRecursividadRedundante](https://reader033.vdocuments.mx/reader033/viewer/2022052913/55cf9807550346d033952034/html5/thumbnails/1.jpg)
Eliminación de la recursividad redundante
![Page 2: EliminacionRecursividadRedundante](https://reader033.vdocuments.mx/reader033/viewer/2022052913/55cf9807550346d033952034/html5/thumbnails/2.jpg)
Algoritmos recursivos
• Ventajas:– Sencillez
• Desventajas:– Ineficiencia:
• Muy grave su hay redundancia• Factores constantes si no hay redundancia
• Técnicas de eliminación de la recursividad:– Recursividad general– Recursividad lineal– Recursividad redundante (múltiple)
![Page 3: EliminacionRecursividadRedundante](https://reader033.vdocuments.mx/reader033/viewer/2022052913/55cf9807550346d033952034/html5/thumbnails/3.jpg)
Ejemplo de eliminación de recursividad lineal
Intercambiar 2 secciones de un vector :• Dado un vector v, intercambiar las l primeras celdas con
las n-l restantes• El intercambio debe realizarse sobre el mismo vector,
sin un vector auxiliar
![Page 4: EliminacionRecursividadRedundante](https://reader033.vdocuments.mx/reader033/viewer/2022052913/55cf9807550346d033952034/html5/thumbnails/4.jpg)
Ejemplo de eliminación de recursividad lineal
public static void intercambiarSecciones (int l, int[ ] v) { interAux (l, v.length-l, l, v);}
donde:• interAux(i,j,k,v) intercambia dos secciones consecutivas
de v, de longitudes i y j, de forma que la segunda comienza en la posición k
![Page 5: EliminacionRecursividadRedundante](https://reader033.vdocuments.mx/reader033/viewer/2022052913/55cf9807550346d033952034/html5/thumbnails/5.jpg)
Ejemplo de eliminación de recursividad lineal
![Page 6: EliminacionRecursividadRedundante](https://reader033.vdocuments.mx/reader033/viewer/2022052913/55cf9807550346d033952034/html5/thumbnails/6.jpg)
Ejemplo de eliminación de recursividad lineal
• interAux(i,j,k,v) intercambia dos secciones consecutivas de v, de longitudes i y j, de forma que la segunda comienza en la posición k
• intercambiar(i,j,m,v) intercambia dos secciones consecutivas de v de longitud m y que comienzan en las posiciones i y j
private static void interAux (int i, int j, int k, int[ ] v) { if (i==j) intercambiar (k-i, k, i, v); else if (i<j) { intercambiar (k-i, k+j-i, i, v); interAux (i, j-i, k, v); } else { intercambiar (k-i, k, j, v); interAux (i-j, j, k, v); } }
![Page 7: EliminacionRecursividadRedundante](https://reader033.vdocuments.mx/reader033/viewer/2022052913/55cf9807550346d033952034/html5/thumbnails/7.jpg)
Ejemplo de eliminación de recursividad lineal
• intercambiar intercambia dos secciones consecutivas de v de longitud m y que comienzan en las posiciones i y j:
public static void intercambiar (int i, int j, int m, int[ ] v) { for (int k=0; k<m; k++) { int temp = v[i+k]; v[i+k] = v[j+k]; v[j+k] = temp; } }
![Page 8: EliminacionRecursividadRedundante](https://reader033.vdocuments.mx/reader033/viewer/2022052913/55cf9807550346d033952034/html5/thumbnails/8.jpg)
Ejemplo de eliminación de recursividad lineal
• Usando un esquema de eliminación de la recursividad final:
public static void intercambiarSecciones (int l, int[ ] v) { int i = l; int j = v.length-l; int k = l; while (i!=j) if (i<j) { j = j-i; intercambiar (k-i, k+j-i, i, v); } else { intercambiar (k-i, k, j, v); i = i-j; } intercambiar (k-i, k, i, v); }
Puede expandirse la definición de intercambiar, resultando un algoritmo con dos bucles anidados:
Algoritmo iterativo difícil de diseñar sin la versión recursiva inicial
![Page 9: EliminacionRecursividadRedundante](https://reader033.vdocuments.mx/reader033/viewer/2022052913/55cf9807550346d033952034/html5/thumbnails/9.jpg)
Eliminación de la recursividad redundante
• Pasos:1. Análisis de la redundancia:
a. Árbol de recursión
b. Grafo de dependencia
2. Técnicas de eliminación de la redundancia:• Memorización• Tabulación
3. Optimización de memoria
![Page 10: EliminacionRecursividadRedundante](https://reader033.vdocuments.mx/reader033/viewer/2022052913/55cf9807550346d033952034/html5/thumbnails/10.jpg)
Análisis de redundancia
• Algoritmo recursivo (múltiple) con redundancias:
public static int fib (int n) {
if ((n==0) || (n==1))
return 1;
else
return fib(n-1) + fib(n-2);
}
![Page 11: EliminacionRecursividadRedundante](https://reader033.vdocuments.mx/reader033/viewer/2022052913/55cf9807550346d033952034/html5/thumbnails/11.jpg)
Análisis de redundancia
• Árbol de recursión de fib(5):– Usando SRec
![Page 12: EliminacionRecursividadRedundante](https://reader033.vdocuments.mx/reader033/viewer/2022052913/55cf9807550346d033952034/html5/thumbnails/12.jpg)
Análisis de redundancia
• Árbol de recursión de fib(5):
• Grafo de dependencia de fib(5):
![Page 13: EliminacionRecursividadRedundante](https://reader033.vdocuments.mx/reader033/viewer/2022052913/55cf9807550346d033952034/html5/thumbnails/13.jpg)
Análisis de redundancia
• Definición: • Árbol de recursión de C5,2:
![Page 14: EliminacionRecursividadRedundante](https://reader033.vdocuments.mx/reader033/viewer/2022052913/55cf9807550346d033952034/html5/thumbnails/14.jpg)
Análisis de redundancia
• Árbol de recursión de C5,2:
• Grafo de dependencia de C5,2:
n+1
m-n+1
![Page 15: EliminacionRecursividadRedundante](https://reader033.vdocuments.mx/reader033/viewer/2022052913/55cf9807550346d033952034/html5/thumbnails/15.jpg)
public static int fibRabbit (int n) { return bebes(n) + adultos(n); } private static int bebes (int n) { if (n==0) return 1; else return adultos(n-1); } private static int adultos (int n) { if (n==0) return 0; else return adultos(n-1) + bebes(n-1); }
• Dificultad:– Recursividad mutua
Análisis de redundancia
![Page 16: EliminacionRecursividadRedundante](https://reader033.vdocuments.mx/reader033/viewer/2022052913/55cf9807550346d033952034/html5/thumbnails/16.jpg)
• Dificultad: Métodos anidados
public static int ack (int m, int n) { if (m==0) return n+1; else if (n==0) return ack(m-1,1); else return ack(m-1,ack(m,n-1));}
¿Árbol de recursión de ack(2,2)?
Análisis de redundancia
![Page 17: EliminacionRecursividadRedundante](https://reader033.vdocuments.mx/reader033/viewer/2022052913/55cf9807550346d033952034/html5/thumbnails/17.jpg)
![Page 18: EliminacionRecursividadRedundante](https://reader033.vdocuments.mx/reader033/viewer/2022052913/55cf9807550346d033952034/html5/thumbnails/18.jpg)
Análisis de redundancia
• No todos los algoritmos recursivos múltiples son redundantes:– Algoritmos de divide y vencerás:
• P.ej. ordenación por mezcla (árbol de recursión con índices del subvector a ordenar)
![Page 19: EliminacionRecursividadRedundante](https://reader033.vdocuments.mx/reader033/viewer/2022052913/55cf9807550346d033952034/html5/thumbnails/19.jpg)
Memorizaciónpublic static T’ f (T x) {
if (P<x>)
return B<x>;
else
return
C(E<x>, f(D1<x>),f(D2<x>));
}
public static T’ F (T x) { T’[ ] t = new T’[x]; for (i=0; i<=n; i++) t[i] = v; M (x,t); return (t[x]);}private static void M (T x, T’[ ] t) { if (t[x] == v) if (P<x>) t[x] = B<x>; else { M(D1<x>,t); M(D2<x>,t); t[x] = C(E<x>, t[D1<x>], t[D2<x>]); }}
![Page 20: EliminacionRecursividadRedundante](https://reader033.vdocuments.mx/reader033/viewer/2022052913/55cf9807550346d033952034/html5/thumbnails/20.jpg)
Memorizaciónpublic static int fib (int n) { if (n==0 || n==1) return 1; else return fib(n-1) + fib(n-2); }
public static int fib (int n) { int[ ] fibs = new int[n+1]; for (int i=0; i<=n; i++) fibs[i] = -1; fibMem (n, fibs); return fibs[n];}private static void fibMem (int n, int[ ] fibs){ if (fibs[n] == -1) if (n==0||n==1) fibs[n] = 1; else { fibMem (n-1, fibs); fibMem (n-2, fibs); fibs[n] = fibs[n-1]+fibs[n-2]; }}
![Page 21: EliminacionRecursividadRedundante](https://reader033.vdocuments.mx/reader033/viewer/2022052913/55cf9807550346d033952034/html5/thumbnails/21.jpg)
public static int comb (int m, int n) { if (n==0||m==n) return 1; else return comb(m-1,n) +
comb(m-1,n-1);}
public static int comb (int m, int n) { int[ ][ ] combs = new int[m-n+1][n+1]; for (int i=0; i<=m-n; i++) for (int j=0; j<=n; j++) combs[i][j] = 0; combMem (m, n, combs); return combs[m-n][n]; } private static void combMem (int m, int n, int[ ][ ] combs) { if (combs[m-n][n] == 0) if (n==0||m==n) combs[m-n][n] = 1; else { combMem (m-1, n, combs); combMem (m-1, n-1, combs); combs[m-n][n] = combs[m-n-1][n] + combs[m-n][n-1]; } }
Memorización
![Page 22: EliminacionRecursividadRedundante](https://reader033.vdocuments.mx/reader033/viewer/2022052913/55cf9807550346d033952034/html5/thumbnails/22.jpg)
Memorización
![Page 23: EliminacionRecursividadRedundante](https://reader033.vdocuments.mx/reader033/viewer/2022052913/55cf9807550346d033952034/html5/thumbnails/23.jpg)
Tabulación
• Algoritmo con un orden lineal de cómputo y una tabla auxiliar:
public static int fib (int n) { int[ ] fibs = new int[n+1]; fibs[0] = 1; fibs[1] = 1; for (int i=2; i<=n; i++) fibs[i] = fibs[i-1]+fibs[i-2]; return fibs[n]; }
![Page 24: EliminacionRecursividadRedundante](https://reader033.vdocuments.mx/reader033/viewer/2022052913/55cf9807550346d033952034/html5/thumbnails/24.jpg)
Tabulación• Algoritmo con orden lineal de cómputo (columnas): public static int comb (int m, int n) { int[ ][ ] combs = new int[m-n+1][n+1]; for (int j=1; j<=n; j++) combs[0][j] = 1; for (int i=1; i<=m-n; i++) { combs[i][0] = 1; for (int j=1; j<=n; j++) combs[i][j] = combs[i-1][j] + combs[i][j-1]; } return combs[m-n][n]; }
![Page 25: EliminacionRecursividadRedundante](https://reader033.vdocuments.mx/reader033/viewer/2022052913/55cf9807550346d033952034/html5/thumbnails/25.jpg)
Tabulación• Algoritmo con orden lineal de cómputo (filas): public static int comb (int m, int n) { int[ ][ ] combs = new int[m-n+1][n+1]; for (int i=1; i<=m-n; i++) combs[i][0] = 1; for (int j=1; j<=n; j++) { combs[0][j] = 1; for (int i=1; i<=m-n; i++) combs[i][j] = combs[i-1][j] + combs[i][j-1]; } return combs[m-n][n]; }
![Page 26: EliminacionRecursividadRedundante](https://reader033.vdocuments.mx/reader033/viewer/2022052913/55cf9807550346d033952034/html5/thumbnails/26.jpg)
Minimización de memoria
• Con optimización de la memoria (f2 >= f1):
public static int fib (int n) { int f1 = 1; int f2 = 1; for (int i=1; i<=n/2; i++) { f1 = f1+f2; f2 = f2+f1; } return (n%2==0)?f1:f2; }
![Page 27: EliminacionRecursividadRedundante](https://reader033.vdocuments.mx/reader033/viewer/2022052913/55cf9807550346d033952034/html5/thumbnails/27.jpg)
Minimización de memoria
• Con optimización de la memoria (f2 >= f1):
public static int fib (int n) { int f1 = 1; int f2 = 1; for (int i=2; i<=n; i++) { int temp = f2; f2 = f1+f2; f1 = temp; } return f2; }
![Page 28: EliminacionRecursividadRedundante](https://reader033.vdocuments.mx/reader033/viewer/2022052913/55cf9807550346d033952034/html5/thumbnails/28.jpg)
Minimización de memoria• Con optimización de la memoria (columnas): public static int comb (int m, int n) { int[] combs = new int[n+1]; for (int j=0; j<=n; j++) combs[j] = 1; for (int i=1; i<=m-n; i++) for (int j=1; j<=n; j++) combs[j] = combs[j] + combs [j-1]; return combs[n]; }
![Page 29: EliminacionRecursividadRedundante](https://reader033.vdocuments.mx/reader033/viewer/2022052913/55cf9807550346d033952034/html5/thumbnails/29.jpg)
Competición deportiva
• Algoritmo recursivo:
P(0,j+1) = 0
P(i+1,0) = 1
P(i+1,j+1) = ½ [P(i,j+1)+P(i+1,j)]• Análisis de redundancia:
![Page 30: EliminacionRecursividadRedundante](https://reader033.vdocuments.mx/reader033/viewer/2022052913/55cf9807550346d033952034/html5/thumbnails/30.jpg)
Competición deportiva
• Tabulación (columnas):
public static float prob (int i, int j) { float[][] tabla = new float[i+1][j+1]; for (int h=1; h<=i; h++) tabla[h][0] = (float)1.0; for (int k=1; k<=j; k++) { tabla[0][k] = (float)0.0; for (int h=1; h<=i; h++) tabla[h][k] = (tabla[h][k-1]+tabla[h-1][k])/2; } return tabla[i][j]; }
![Page 31: EliminacionRecursividadRedundante](https://reader033.vdocuments.mx/reader033/viewer/2022052913/55cf9807550346d033952034/html5/thumbnails/31.jpg)
Competición deportiva
• Tabulación (filas):
public static float prob (int i, int j) { float[][] tabla = new float[i+1][j+1]; for (int k=1; k<=j; k++) tabla[0][k] = (float)0.0; for (int h=1; h<=i; h++) { tabla[h][0] = (float)1.0; for (int k=1; k<=j; k++) tabla[h][k] = (tabla[h][k-1]+tabla[h-1][k])/2; } return tabla[i][j]; }
![Page 32: EliminacionRecursividadRedundante](https://reader033.vdocuments.mx/reader033/viewer/2022052913/55cf9807550346d033952034/html5/thumbnails/32.jpg)
• Tabulación, con memoria optimizada (filas):
public static float prob (int i, int j) { float[] tabla = new float[j+1]; tabla[0] = (float)1.0; for (int k=1; k<=j; k++) tabla[k] = (float)0.0; for (int h=1; h<=i; h++) for (int k=1; k<=j; k++) tabla[k] = (tabla[k-1]+tabla[k])/2; return tabla[j]; }
Competición deportiva
![Page 33: EliminacionRecursividadRedundante](https://reader033.vdocuments.mx/reader033/viewer/2022052913/55cf9807550346d033952034/html5/thumbnails/33.jpg)
Competición deportiva• Tabulación (en diagonal):
public static float prob (int i, int j) { float [ ][ ] tabla = new float[i+1][j+1]; for (int k=1; k<=i+j; k++) { if (k<=j) tabla[0][k] = (float)0.0; if (k<=i) tabla[k][0] = (float)1.0; for (int h=1; h<k; h++) if ((h<=i) && (k-h<=j)) tabla[h][k-h]=(tabla[h-1][k-h]+tabla[h][k-h-1])/2; } return tabla[i][j]; }
![Page 34: EliminacionRecursividadRedundante](https://reader033.vdocuments.mx/reader033/viewer/2022052913/55cf9807550346d033952034/html5/thumbnails/34.jpg)
Mochila 0/1
ps=(3,6,9,5)bs=(7,2,8,4)c=15
cpniparappsibppimpim
ppsipimpim
cpparapnm
iii
i
0,1)),1(),,1(max(
),1(),(
00),1(
![Page 35: EliminacionRecursividadRedundante](https://reader033.vdocuments.mx/reader033/viewer/2022052913/55cf9807550346d033952034/html5/thumbnails/35.jpg)
Mochila 0/1
ps=(3,6,9,5)bs=(7,2,8,4)c=15
cpniparappsibppimpim
ppsipimpim
cpparapnm
iii
i
0,1)),1(),,1(max(
),1(),(
00),1(
![Page 36: EliminacionRecursividadRedundante](https://reader033.vdocuments.mx/reader033/viewer/2022052913/55cf9807550346d033952034/html5/thumbnails/36.jpg)
Mochila 0/1
ps=(3,6,9,5)bs=(7,2,8,4)c=15
cpniparappsibppimpim
ppsipimpim
cpparapnm
iii
i
0,1)),1(),,1(max(
),1(),(
00),1(
![Page 37: EliminacionRecursividadRedundante](https://reader033.vdocuments.mx/reader033/viewer/2022052913/55cf9807550346d033952034/html5/thumbnails/37.jpg)
Mochila 0/1ps=(3,6,9,5)bs=(7,2,8,4)c=15
• Grafo variable:
• Subgrafo de:
cpniparappsibppimpim
ppsipimpim
cpparapnm
iii
i
0,1)),1(),,1(max(
),1(),(
00),1(
Tabla mínima
![Page 38: EliminacionRecursividadRedundante](https://reader033.vdocuments.mx/reader033/viewer/2022052913/55cf9807550346d033952034/html5/thumbnails/38.jpg)
• Solución recursiva:
• um={200,100,50,20,10,5,2,1}• m(0,12):
Cambio de monedas
][/0,10])[·,1(min),(
0),(
iumxjniparaiumjximjxim
cxparaxxnm
![Page 39: EliminacionRecursividadRedundante](https://reader033.vdocuments.mx/reader033/viewer/2022052913/55cf9807550346d033952034/html5/thumbnails/39.jpg)
• Solución recursiva:
• um={7,5,1}, m(0,10):
Cambio de monedas
][/0,10])[·,1(min),(
0),(
iumxjniparaiumjximjxim
cxparaxxnm
![Page 40: EliminacionRecursividadRedundante](https://reader033.vdocuments.mx/reader033/viewer/2022052913/55cf9807550346d033952034/html5/thumbnails/40.jpg)
Cambio de monedas
• um={7,5,1}, c=10: