Recursión - it.uc3m.es · [email protected] Java: Recursión / 2 Método recursivo Un método...
Transcript of Recursión - it.uc3m.es · [email protected] Java: Recursión / 2 Método recursivo Un método...
![Page 1: Recursión - it.uc3m.es · cdk@it.uc3m.es Java: Recursión / 2 Método recursivo Un método recursivo es aquel que (directa o indirectamente) se llama a si mismo. (Para que el método](https://reader030.fdocumentos.com/reader030/viewer/2022040202/5e6fba8fe10414168b672fa2/html5/thumbnails/1.jpg)
[email protected] Java: Recursión / 1
Recursión
Carlos Delgado KloosIngeniería TelemáticaUniv. Carlos III de Madrid
![Page 2: Recursión - it.uc3m.es · cdk@it.uc3m.es Java: Recursión / 2 Método recursivo Un método recursivo es aquel que (directa o indirectamente) se llama a si mismo. (Para que el método](https://reader030.fdocumentos.com/reader030/viewer/2022040202/5e6fba8fe10414168b672fa2/html5/thumbnails/2.jpg)
[email protected] Java: Recursión / 2
Método recursivo
❚ Un método recursivo es aquel que(directa o indirectamente)se llama a si mismo.
❚ (Para que el método recursivo definauna computación que termina)la(s) llamada(s) recursiva(s)han de ser más sencilla(s)(de acuerdo con alguna métrica)
![Page 3: Recursión - it.uc3m.es · cdk@it.uc3m.es Java: Recursión / 2 Método recursivo Un método recursivo es aquel que (directa o indirectamente) se llama a si mismo. (Para que el método](https://reader030.fdocumentos.com/reader030/viewer/2022040202/5e6fba8fe10414168b672fa2/html5/thumbnails/3.jpg)
[email protected] Java: Recursión / 3
Ejemplo 1
❚ public static long s (int n){if (n==1) return 1; else return s(n-1)+n;}
![Page 4: Recursión - it.uc3m.es · cdk@it.uc3m.es Java: Recursión / 2 Método recursivo Un método recursivo es aquel que (directa o indirectamente) se llama a si mismo. (Para que el método](https://reader030.fdocumentos.com/reader030/viewer/2022040202/5e6fba8fe10414168b672fa2/html5/thumbnails/4.jpg)
[email protected] Java: Recursión / 4
Ejemplo 1
❚ s(3) = (llamada recursiva)❚ s(2)+3 = (llamada recursiva)❚ (s(1)+2)+3 = (llamada recursiva)❚ (1+2)+3 = (suma)❚ (3+3)= (suma)❚ 6
![Page 5: Recursión - it.uc3m.es · cdk@it.uc3m.es Java: Recursión / 2 Método recursivo Un método recursivo es aquel que (directa o indirectamente) se llama a si mismo. (Para que el método](https://reader030.fdocumentos.com/reader030/viewer/2022040202/5e6fba8fe10414168b672fa2/html5/thumbnails/5.jpg)
[email protected] Java: Recursión / 5
Ejemplo 2
❚ public static long s (int n){if (n==1) return 1; else return s(n+1)+n;}
(para n>1)
![Page 6: Recursión - it.uc3m.es · cdk@it.uc3m.es Java: Recursión / 2 Método recursivo Un método recursivo es aquel que (directa o indirectamente) se llama a si mismo. (Para que el método](https://reader030.fdocumentos.com/reader030/viewer/2022040202/5e6fba8fe10414168b672fa2/html5/thumbnails/6.jpg)
[email protected] Java: Recursión / 6
Ejemplo 2
❚ s(3) = (llam. rec.)❚ s(4)+3 = (llam. rec.)❚ (s(5)+4)+3 = (llam. rec.)❚ ((s(6)+5)+4)+3 = (llam. rec.)❚ (((s(7)+6)+5)+4)+3 = (llam. rec.)❚ ((((s(8)+7)+6)+5)+4)+3 =❚ ...
❚ No termina
![Page 7: Recursión - it.uc3m.es · cdk@it.uc3m.es Java: Recursión / 2 Método recursivo Un método recursivo es aquel que (directa o indirectamente) se llama a si mismo. (Para que el método](https://reader030.fdocumentos.com/reader030/viewer/2022040202/5e6fba8fe10414168b672fa2/html5/thumbnails/7.jpg)
[email protected] Java: Recursión / 7
¿Qué debe tenerun método recursivo?
❚ CondicionalCaso base (no recursivo) 1
Caso recursivo s(n-1)+n (que se aproxima haciala condición del caso base) (n==1)
![Page 8: Recursión - it.uc3m.es · cdk@it.uc3m.es Java: Recursión / 2 Método recursivo Un método recursivo es aquel que (directa o indirectamente) se llama a si mismo. (Para que el método](https://reader030.fdocumentos.com/reader030/viewer/2022040202/5e6fba8fe10414168b672fa2/html5/thumbnails/8.jpg)
Ejercicios: cuentaAtras
void cuentaAtras (int contador)
{if(contador == 0)
return;
else {
System.out.println(""+contador);
cuentaAtras(--contador);
return;
}
}
[email protected] Java: Recursión / 8
![Page 9: Recursión - it.uc3m.es · cdk@it.uc3m.es Java: Recursión / 2 Método recursivo Un método recursivo es aquel que (directa o indirectamente) se llama a si mismo. (Para que el método](https://reader030.fdocumentos.com/reader030/viewer/2022040202/5e6fba8fe10414168b672fa2/html5/thumbnails/9.jpg)
Ejercicio: cuadrado
❚ (N-1)2 = N2 - 2N + 1❚ N2 = (N-1)2 + 2N - 1
❚ cuadrado(1) = 1❚ cuadrado(N) = cuadrado(N-1) + 2N
-1
[email protected] Java: Recursión / 9
![Page 10: Recursión - it.uc3m.es · cdk@it.uc3m.es Java: Recursión / 2 Método recursivo Un método recursivo es aquel que (directa o indirectamente) se llama a si mismo. (Para que el método](https://reader030.fdocumentos.com/reader030/viewer/2022040202/5e6fba8fe10414168b672fa2/html5/thumbnails/10.jpg)
Ejercicio: cuadrado
int cuadrado (int n)
{if (n == 1)
return 1;
else
return cuadrado(n-1)+2*n-1;
}
[email protected] Java: Recursión / 10
![Page 11: Recursión - it.uc3m.es · cdk@it.uc3m.es Java: Recursión / 2 Método recursivo Un método recursivo es aquel que (directa o indirectamente) se llama a si mismo. (Para que el método](https://reader030.fdocumentos.com/reader030/viewer/2022040202/5e6fba8fe10414168b672fa2/html5/thumbnails/11.jpg)
Ejercicio: misterio
❚ misterio(0,Q) = Q❚ misterio(P,Q) = misterio(P-1, Q+1)
❚ ¿Cuánto vale misterio(2,4)?
[email protected] Java: Recursión / 11
![Page 12: Recursión - it.uc3m.es · cdk@it.uc3m.es Java: Recursión / 2 Método recursivo Un método recursivo es aquel que (directa o indirectamente) se llama a si mismo. (Para que el método](https://reader030.fdocumentos.com/reader030/viewer/2022040202/5e6fba8fe10414168b672fa2/html5/thumbnails/12.jpg)
[email protected] Java: Recursión / 12
Tipos de recursión:Recursión lineal
❚ Recursión lineal(máximo una llamada recursivapor rama del condicional)Recursión por la cola
(última operación en rama:llamada recursiva)
Recursión no por la cola(operación pendiente)
![Page 13: Recursión - it.uc3m.es · cdk@it.uc3m.es Java: Recursión / 2 Método recursivo Un método recursivo es aquel que (directa o indirectamente) se llama a si mismo. (Para que el método](https://reader030.fdocumentos.com/reader030/viewer/2022040202/5e6fba8fe10414168b672fa2/html5/thumbnails/13.jpg)
[email protected] Java: Recursión / 13
Tipos de recursión:Recursión no lineal
❚ Recursión no linealRecursión en cascada
( op(f...,f...) )Recursión anidada
( f(...f...) )...
![Page 14: Recursión - it.uc3m.es · cdk@it.uc3m.es Java: Recursión / 2 Método recursivo Un método recursivo es aquel que (directa o indirectamente) se llama a si mismo. (Para que el método](https://reader030.fdocumentos.com/reader030/viewer/2022040202/5e6fba8fe10414168b672fa2/html5/thumbnails/14.jpg)
Java: Recursión / 14
Ejemplo 3:Factorial
n fac(n)
0 1
1 1
2 2
3 6
4 24
5 120
... ...
fac(n) = n!
fac(5)=5*fac(4)=5*24=120
fac(5)=5*4*3*2*1
![Page 15: Recursión - it.uc3m.es · cdk@it.uc3m.es Java: Recursión / 2 Método recursivo Un método recursivo es aquel que (directa o indirectamente) se llama a si mismo. (Para que el método](https://reader030.fdocumentos.com/reader030/viewer/2022040202/5e6fba8fe10414168b672fa2/html5/thumbnails/15.jpg)
[email protected] Java: Recursión / 15
Recursión no por la cola: Factorial
❚ public static long fac (int n){if (n<=1) return 1; else return n*fac(n-1);}
![Page 16: Recursión - it.uc3m.es · cdk@it.uc3m.es Java: Recursión / 2 Método recursivo Un método recursivo es aquel que (directa o indirectamente) se llama a si mismo. (Para que el método](https://reader030.fdocumentos.com/reader030/viewer/2022040202/5e6fba8fe10414168b672fa2/html5/thumbnails/16.jpg)
[email protected] Java: Recursión / 16
Recursión por la cola: Factorial
❚ public static long fact (int n,m){if (n<=1) return m; else return fact(n-1,n*m);}
❚ public static long fac (int n){return fact(n,1);}
![Page 17: Recursión - it.uc3m.es · cdk@it.uc3m.es Java: Recursión / 2 Método recursivo Un método recursivo es aquel que (directa o indirectamente) se llama a si mismo. (Para que el método](https://reader030.fdocumentos.com/reader030/viewer/2022040202/5e6fba8fe10414168b672fa2/html5/thumbnails/17.jpg)
[email protected] Java: Recursión / 17
Ejemplo 4:Fibonacci
n fib(n)
0 1
1 1
2 2
3 3
4 5
5 8
... ...
fib(5)=fib(4)+fib(3)
= 5+3
![Page 18: Recursión - it.uc3m.es · cdk@it.uc3m.es Java: Recursión / 2 Método recursivo Un método recursivo es aquel que (directa o indirectamente) se llama a si mismo. (Para que el método](https://reader030.fdocumentos.com/reader030/viewer/2022040202/5e6fba8fe10414168b672fa2/html5/thumbnails/18.jpg)
[email protected] Java: Recursión / 18
Ejemplo 4:Fibonacci
❚ Ejercicio: Buscar las aplicaciones de Fibonacci buscandocon google
![Page 19: Recursión - it.uc3m.es · cdk@it.uc3m.es Java: Recursión / 2 Método recursivo Un método recursivo es aquel que (directa o indirectamente) se llama a si mismo. (Para que el método](https://reader030.fdocumentos.com/reader030/viewer/2022040202/5e6fba8fe10414168b672fa2/html5/thumbnails/19.jpg)
[email protected] Java: Recursión / 19
Recursión en cascada:Fibonacci
❚ public static long fib (int n){if (n<=1) return 1; else return fib(n-1)+fib(n-2);}
![Page 20: Recursión - it.uc3m.es · cdk@it.uc3m.es Java: Recursión / 2 Método recursivo Un método recursivo es aquel que (directa o indirectamente) se llama a si mismo. (Para que el método](https://reader030.fdocumentos.com/reader030/viewer/2022040202/5e6fba8fe10414168b672fa2/html5/thumbnails/20.jpg)
[email protected] Java: Recursión / 20
Fibonacci
fib(4)
fib(3) fib(2)
fib(2) fib(1)
fib(1) fib(0)1 1
12
3 2
5
fib(1) fib(0)1 1
![Page 21: Recursión - it.uc3m.es · cdk@it.uc3m.es Java: Recursión / 2 Método recursivo Un método recursivo es aquel que (directa o indirectamente) se llama a si mismo. (Para que el método](https://reader030.fdocumentos.com/reader030/viewer/2022040202/5e6fba8fe10414168b672fa2/html5/thumbnails/21.jpg)
[email protected] Java: Recursión / 21
Fibonacci lineal
❚ public static long fibo (int n,x,y){if (n<=1) return x+y; else return fibo(n-1,y,x+y);}
❚ public static long fib (int n){return fibo(n,0,1);}
![Page 22: Recursión - it.uc3m.es · cdk@it.uc3m.es Java: Recursión / 2 Método recursivo Un método recursivo es aquel que (directa o indirectamente) se llama a si mismo. (Para que el método](https://reader030.fdocumentos.com/reader030/viewer/2022040202/5e6fba8fe10414168b672fa2/html5/thumbnails/22.jpg)
[email protected] Java: Recursión / 22
fibo(4,0,1)
fibo(3,1,1)
fibo(2,1,2)
Fibonacci
fib(4)
5
5
55
fibo(1,2,3)
5
![Page 23: Recursión - it.uc3m.es · cdk@it.uc3m.es Java: Recursión / 2 Método recursivo Un método recursivo es aquel que (directa o indirectamente) se llama a si mismo. (Para que el método](https://reader030.fdocumentos.com/reader030/viewer/2022040202/5e6fba8fe10414168b672fa2/html5/thumbnails/23.jpg)
[email protected] Java: Recursión / 23
Fibonacci no recursivo
(1+√5)n+1 - (1-√5)n+1
fib(n)=—————————— (2n+1·√5)
![Page 24: Recursión - it.uc3m.es · cdk@it.uc3m.es Java: Recursión / 2 Método recursivo Un método recursivo es aquel que (directa o indirectamente) se llama a si mismo. (Para que el método](https://reader030.fdocumentos.com/reader030/viewer/2022040202/5e6fba8fe10414168b672fa2/html5/thumbnails/24.jpg)
[email protected] Java: Recursión / 24
Recursión anidada:Morris
❚ public static long mor(int n, m){if (n==m) return (m+1); else return mor(n,mor(n-1,m+1));}
![Page 25: Recursión - it.uc3m.es · cdk@it.uc3m.es Java: Recursión / 2 Método recursivo Un método recursivo es aquel que (directa o indirectamente) se llama a si mismo. (Para que el método](https://reader030.fdocumentos.com/reader030/viewer/2022040202/5e6fba8fe10414168b672fa2/html5/thumbnails/25.jpg)
[email protected] Java: Recursión / 25
Morris
❚ mor(4,0) =❚ mor(4,mor(3,1)) =❚ mor(4,mor(3,mor(2,2)) =❚ mor(4,mor(3,3)) =❚ mor(4,4) =❚ 5
![Page 26: Recursión - it.uc3m.es · cdk@it.uc3m.es Java: Recursión / 2 Método recursivo Un método recursivo es aquel que (directa o indirectamente) se llama a si mismo. (Para que el método](https://reader030.fdocumentos.com/reader030/viewer/2022040202/5e6fba8fe10414168b672fa2/html5/thumbnails/26.jpg)
[email protected] Java: Recursión / 26
Recursión anidada: Ackermann
❚ public static long ack (int n, m){if (n==0) return (m+1); else if (m==0) return ack(n-1,1); else return ack(n-1,ack(n,m-1));}
![Page 27: Recursión - it.uc3m.es · cdk@it.uc3m.es Java: Recursión / 2 Método recursivo Un método recursivo es aquel que (directa o indirectamente) se llama a si mismo. (Para que el método](https://reader030.fdocumentos.com/reader030/viewer/2022040202/5e6fba8fe10414168b672fa2/html5/thumbnails/27.jpg)
[email protected] Java: Recursión / 27
Recursión mutua
❚ public static boolean impar (int n){if (n==0) return false; else return par(n-1);}
❚ public static boolean par (int n){if (n==0) return true; else return impar(n-1);}
impar
par
![Page 28: Recursión - it.uc3m.es · cdk@it.uc3m.es Java: Recursión / 2 Método recursivo Un método recursivo es aquel que (directa o indirectamente) se llama a si mismo. (Para que el método](https://reader030.fdocumentos.com/reader030/viewer/2022040202/5e6fba8fe10414168b672fa2/html5/thumbnails/28.jpg)
[email protected] Java: Recursión / 28
Recursión vs. Iteración
❚ La recursión por la cola se puede convertir de forma inmediata en iteración (bucle).
❚ Para otras formas de recursión se requieren técnicas de transformación de programas y posiblemente estructuras de datos más complejas.
"The transformation from recursion to iteration is one of the most fundamental concepts of computer science.“ -- D. Knuth 1974
![Page 29: Recursión - it.uc3m.es · cdk@it.uc3m.es Java: Recursión / 2 Método recursivo Un método recursivo es aquel que (directa o indirectamente) se llama a si mismo. (Para que el método](https://reader030.fdocumentos.com/reader030/viewer/2022040202/5e6fba8fe10414168b672fa2/html5/thumbnails/29.jpg)
[email protected] Java: Recursión / 29
Factorial
❚ public static long fact (int n,m){private int N,M; N=n; M=m; while !(N<=1) {M=N*M; N=N-1;} return M; }
❚ public static long fact (int n,m){if (n<=1) return m; else return fact(n-1,n*m);}