5hfxuvlyq - departamento de ingeniería telemática - …cdk/curs/prog2/00-01/recur-compl.pdf · 22...
TRANSCRIPT
1
Copyright © 2001 [email protected] Java: Recursión y Complejidad / 1
5HFXUVLyQ
&DUORV�'HOJDGR�.ORRV
,QJHQLHUtD�7HOHPiWLFD
8QLY��&DUORV�,,,�GH�0DGULG
Copyright © 2001 [email protected] Java: Recursión y Complejidad / 2
0pWRGR�UHFXUVLYR
❚ 8Q�PpWRGR�UHFXUVLYR�HV�DTXHO�TXH�GLUHFWD�R�LQGLUHFWDPHQWH�VH�OODPD�D�VL�PLVPR�
❚ �3DUD�TXH�HO�PpWRGR�UHFXUVLYR�GHILQDXQD�FRPSXWDFLyQ�TXH�WHUPLQD�OD�V��OODPDGD�V��UHFXUVLYD�V�KDQ�GH�VHU�PiV�VHQFLOOD�V��GH�DFXHUGR�FRQ�DOJXQD�PpWULFD�
2
Copyright © 2001 [email protected] Java: Recursión y Complejidad / 3
(MHPSOR��
❚ public static long s (int n){if (n==1)
return 1;else
return s(n-1)+n;}
Copyright © 2001 [email protected] Java: Recursión y Complejidad / 4
(MHPSOR��
❚ s(3) = �OODPDGD�UHFXUVLYD�
❚ s(2)+3 = �OODPDGD�UHFXUVLYD�
❚ (s(1)+2)+3 = �OODPDGD�UHFXUVLYD�
❚ (1+2)+3 = �VXPD�
❚ (3+3)= �VXPD�
❚ 6
3
Copyright © 2001 [email protected] Java: Recursión y Complejidad / 5
(MHPSOR��
❚ public static long s (int n){if (n==1)
return 1;else
return s(n+1)+n;}
Copyright © 2001 [email protected] Java: Recursión y Complejidad / 6
(MHPSOR��
❚ s(3) = �OODP��UHF��
❚ s(4)+3 = �OODP��UHF��
❚ (s(5)+4)+3 = �OODP��UHF��
❚ ((s(6)+5)+4)+3 = �OODP��UHF��
❚ (((s(7)+6)+5)+4)+3 = �OODP��UHF��
❚ ((((s(8)+7)s(7)+6)+5)+4)+3 =
❚ ...
❚ 1R�WHUPLQD
4
Copyright © 2001 [email protected] Java: Recursión y Complejidad / 7
¢4Xp�GHEH�WHQHU
XQ�PpWRGR�UHFXUVLYR"
❚ &RQGLFLRQDO❙ &DVR�QR�UHFXUVLYR 1
❙ &DVR�UHFXUVLYR s(n-1)+n
�TXH�VH�DSUR[LPD�KDFLDOD�FRQGLFLyQ�GH�SDUDGD� (n==1)
Copyright © 2001 [email protected] Java: Recursión y Complejidad / 8
7LSRV�GH�UHFXUVLyQ�
5HFXUVLyQ�OLQHDO
❚ 5HFXUVLyQ�OLQHDO�Pi[LPR�XQD�OODPDGD�UHFXUVLYDSRU�UDPD�GHO�FRQGLFLRQDO�
❙ 5HFXUVLyQ SRU�OD�FROD�~OWLPD�RSHUDFLyQ�HQ�UDPD�OODPDGD�UHFXUVLYD�
❙ 5HFXUVLyQ QR�SRU�OD�FROD�RSHUDFLyQ�SHQGLHQWH�
5
Copyright © 2001 [email protected] Java: Recursión y Complejidad / 9
7LSRV�GH�UHFXUVLyQ�
5HFXUVLyQ�QR�OLQHDO
❚ 5HFXUVLyQ QR�OLQHDO
❙ 5HFXUVLyQ�HQ�FDVFDGD��RS�I����I������
❙ 5HFXUVLyQ�DQLGDGD��I����I������
❙ ���
Copyright © 2001 [email protected] Java: Recursión y Complejidad / 10
(MHPSOR���
)DFWRULDO
......
1205
244
63
22
11
10
fac(n)nfac(n) = n!
fac(5)=5*fac(4)=5*24=120
fac(5)=5*4*3*2*1
6
Copyright © 2001 [email protected] Java: Recursión y Complejidad / 11
5HFXUVLyQ�QR�SRU�OD�FROD��
)DFWRULDO
❚ public static long fac (int n){if (n<=1)
return 1;else
return n*fac(n-1);}
factermina para
n>=0
Copyright © 2001 [email protected] Java: Recursión y Complejidad / 12
5HFXUVLyQ SRU�OD�FROD��
)DFWRULDO
❚ 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);}
7
Copyright © 2001 [email protected] Java: Recursión y Complejidad / 13
(MHPSOR���
)LERQDFFL
......
85
54
33
22
11
10
fib(n)n
fib(5)=fib(4)+fib(3)=
5+3
Copyright © 2001 [email protected] Java: Recursión y Complejidad / 14
5HFXUVLyQ HQ�FDVFDGD�
)LERQDFFL
❚ public static long fib (int n){if (n<=1)
return 1;else
return fib(n-1)+fib(n-2);}
8
Copyright © 2001 [email protected] Java: Recursión y Complejidad / 15
)LERQDFFL
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
Copyright © 2001 [email protected] Java: Recursión y Complejidad / 16
)LERQDFFL�OLQHDO
❚ 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);}
9
Copyright © 2001 [email protected] Java: Recursión y Complejidad / 17
fibo(4,0,1)
fibo(3,1,1)
fibo(2,1,2)
)LERQDFFL
fib(4)
5
5
55
fibo(1,2,3)
5
Copyright © 2001 [email protected] Java: Recursión y Complejidad / 18
)LERQDFFL�QR�UHFXUVLYR
���√��Q � ���√��Q
ILE�Q� ²²²²²²²²²²��QÂ√��
10
Copyright © 2001 [email protected] Java: Recursión y Complejidad / 19
5HFXUVLyQ DQLGDGD�
0RUULV
❚ public static long mor(int n, m){if (n==m)
return (m+1);else
return mor(n,mor(n-1,m+1));}
Copyright © 2001 [email protected] Java: Recursión y Complejidad / 20
0RUULV
❚ mor(4,0) =
❚ mor(4,mor(3,1)) =
❚ mor(4,mor(3,mor(2,2)) =
❚ mor(4,mor(3,3)) =
❚ mor(4,4) =
❚ 5
11
Copyright © 2001 [email protected] Java: Recursión y Complejidad / 21
5HFXUVLyQ DQLGDGD��
$FNHUPDQQ
❚ 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));}
Copyright © 2001 [email protected] Java: Recursión y Complejidad / 22
5HFXUVLyQ�PXWXD
❚ 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
12
Copyright © 2001 [email protected] Java: Recursión y Complejidad / 23
5HFXUVLyQ�YV��,WHUDFLyQ
❚ /D�UHFXUVLyQ�SRU�OD�FROD�VH�SXHGH�FRQYHUWLU�GH�IRUPD�LQPHGLDWD�HQ�LWHUDFLyQ��EXFOH��
❚ 3DUD�RWUDV�IRUPDV�GH�UHFXUVLyQ�VH�UHTXLHUHQ�WpFQLFDV�GH�WUDQVIRUPDFLyQ�GH�SURJUDPDV�\�SRVLEOHPHQWH�HVWUXFWXUDV�GH�GDWRV�PiV�FRPSOHMDV�
"The transformation from recursion to iterationis one of the most fundamental concepts ofcomputer science." -- D. Knuth 1974
Copyright © 2001 [email protected] Java: Recursión y Complejidad / 24
)DFWRULDO
❚ public static long fact (int n,m){private int N,M;
N=n; M=m;while !(N<=1)
{N=N-1; M=N*M;}return M;
}
❚ public static long fact (int n,m){if (n<=1)
return m;else
returnfact(n-1,n*m);
}
13
Copyright © 2001 [email protected] Java: Recursión y Complejidad / 25
&RPSOHMLGDG
&DUORV�'HOJDGR�.ORRV
,QJHQLHUtD�7HOHPiWLFD
8QLY��&DUORV�,,,�GH�0DGULG
Copyright © 2001 [email protected] Java: Recursión y Complejidad / 26
&RPSDUDFLyQ
❚ long fib (int n){if (n<=1)
return n;else
returnfib(n-1)+fib(n-2);
}
❚ long fibo (intn,x,y){if (n<=1)
return x+y;else
returnfibo(n-1,y,x+y);
}❚ /RV�GRV�PpWRGRV�FDOFXODQ�OD�IXQFLyQ�fibFRUUHFWDPHQWH��¢SHUR�FXiO�SUHIHULUtD"❚ (O�VHJXQGR�HV�PiV�HILFLHQWH�
14
Copyright © 2001 [email protected] Java: Recursión y Complejidad / 27
¢&yPR�PHGLPRV"
❚ 0LGLHQGR�HO�WLHPSR�GH�HMHFXFLyQ��HQ�IXQFLyQ�GHO�WDPDxR�GH�OD�HQWUDGD❙ 1R�SRGHPRV�SUREDU�FRQ�WRGDV�ODV�HQWUDGDV
❙ (V�QHFHVDULR�LPSOHPHQWDU�HO�DOJRULWPR
❙ 'HSHQGH�GHO�VRIWZDUH�\�HO�KDUGZDUH
❚ %XVTXHPRV�RWUD�PHGLGD❙ 0iV�DEVWUDFWD
❙ 0iV�IiFLO�GH�REWHQHU
Copyright © 2001 [email protected] Java: Recursión y Complejidad / 28
¢&yPR�PHGLPRV"
❚ $VRFLDPRV�D�FDGD�DOJRULWPR��I�Q�
❚ (PSOHDUHPRV�HO�FDVR�SHRU SDUD�FDUDFWHUL]DU�HO�WLHPSR�GH�HMHFXFLyQ
❚ (V�PiV�IiFLO�GH�FDOFXODU
❚ ,QWHUHVD�OD�YHORFLGDG�GH�FUHFLPLHQWR�GHO�WLHPSR�GH�HMHFXFLyQ�HQ�IXQFLyQ�GHO�WDPDxR�GH�OD�HQWUDGD
❚ &RPSRUWDPLHQWR�DVLQWyWLFR
Tamaño de la entrada
15
Copyright © 2001 [email protected] Java: Recursión y Complejidad / 29
¢&yPR�PHGLPRV"
❚ $VRFLDPRV�D�FDGD�RSHUDFLyQ�SULPLWLYD�XQ�WLHPSR�GH�HMHFXFLyQ�FRQVWDQWH�❙ $VLJQDFLyQ
❙ /ODPDGD�D�PpWRGR
❙ 2SHUDFLyQ�DULWPpWLFD��HWF�
❙ ,QGH[DFLyQ�HQ�DUUD\
❙ 6HJXLU�XQD�UHIHUHQFLD
❙ 9ROYHU�GH�XQ�PpWRGR
❙ (WF�
Copyright © 2001 [email protected] Java: Recursión y Complejidad / 30
(MHPSOR
�HQ�SVHXGRFyGLJR�
❚ +DOODU�HO�Pi[LPR�GH�XQ�DUUD\
❚ (QWUDGD��XQ�DUUD\�$�FRQ�Q�HQWHURV
❚ 6DOLGD��HO�HOHPHQWR�PD\RU�GH�$❚ $OJRULWPR��arrayMax(A,n)❚ current=A[0]
for i=1 to n-1 doif current<A[i]
then current=A[i]return current
16
Copyright © 2001 [email protected] Java: Recursión y Complejidad / 31
(MHPSOR
�HQ�SVHXGRFyGLJR�
❚ current=A[0]for i=1 to n-1 do
if current<A[i]then current=A[i]
return current
❚ 0tQLPR�Q~P��GH�RSHUDFLRQHV��VL�HV�A[0] ������Q���Q����� �Q
❚ 0i[LPR�Q~P��GH�RSHUDFLRQHV��VL�A FUHFLHQWH������Q���Q����� �Q��
Copyright © 2001 [email protected] Java: Recursión y Complejidad / 32
1RWDFLyQ�2
n0
f(n)
c⋅g(n)
f(n) es O(g(n)) sii f(n)≤ c ⋅ g(n) para n ≥ n0
17
Copyright © 2001 [email protected] Java: Recursión y Complejidad / 33
1RWDFLyQ�2
❚ �Q����HV��2�Q�
❙ F ���Q� �
❙ �Q���≤ �Q❚ ��Q����Q�ORJ�Q����HV��2�Q��
❚ ��ORJ�Q���ORJ�ORJ�Q��HV��2�ORJ�Q�
❚ ���� HV��2���
❚ ��Q��HV���2���Q�
Copyright © 2001 [email protected] Java: Recursión y Complejidad / 34
5HJODV
❚ I�Q���HV��2�D�I�Q��
❚ I�Q�≤J�Q��∧ J�Q��HV�2�K�Q���⇒I�Q��HV�2�K�Q��
❚ I�Q� HV�2�J�Q���∧ J�Q��HV�2�K�Q���⇒I�Q��HV�2�K�Q��
❚ I�Q��J�Q���HV��2�PD[^I�Q��J�Q�`�
❚ J�Q��HV�2�K�Q���⇒ I�Q��J�Q��HV�2�I�Q�K�Q��
❚ J�Q��HV�2�K�Q���⇒ I�Q��J�Q��HV�2�I�Q�K�Q��
18
Copyright © 2001 [email protected] Java: Recursión y Complejidad / 35
5HJODV
❚ I�Q��HV�SROLQRPLR�GH�JUDGR�G�⇒ I�Q��HV�2�QG�
❚ [!��∧ D!��⇒ Q[ HV�2�DQ�
❚ [!��⇒ ORJ�Q[ HV�2�ORJ�Q�
❚ [!��∧ \!��⇒ ORJ[ Q�HV�2�Q\�
£([SUHVDU�VLHPSUH�HO�RUGHQFRQ�OD�H[SUHVLyQ�PiV�VLPSOH�
Copyright © 2001 [email protected] Java: Recursión y Complejidad / 36
&UHFLPLHQWR
GH�IXQFLRQHV
��� ������������������������������
��� �������������������������
���������������������������������
����������������������
���������������
������������
���������
�QQ�Q�Q ORJ QQ√QORJ Q
19
Copyright © 2001 [email protected] Java: Recursión y Complejidad / 37
7DPDxR�Pi[LPR
GH�XQ�SUREOHPD
�������Q
�������Q�
���������������Q�
�����������������������QORJ�Q
������������������������Q
��KRUD��PLQXWR��VHJXQGR7LHPSR�GH�HMHFXFLyQ
Copyright © 2001 [email protected] Java: Recursión y Complejidad / 38
(MHPSOR
❚ 'DGR�XQ�DUUD\�$�GH�Q�Q~PHURV
❚ &DOFXODU�RWUR�DUUD\�%��WDO�TXH�
∑LM �$>M@
%>L@ ²²²²²L��
20
Copyright © 2001 [email protected] Java: Recursión y Complejidad / 39
6ROXFLyQ��
❚ for i=0 to n-1 doa=0for j=0 to i do
a=a+A[j]B[i]=a/(i+1)
return B
Copyright © 2001 [email protected] Java: Recursión y Complejidad / 40
6ROXFLyQ����$QiOLVLV
❚ 3DUWHV�
❙ ,QLFLDOL]DU�\�GHYROYHU�DUUD\�%��2�Q�
❙ %XFOH�L��VH�HMHFXWD�Q�YHFHV
❙ %XFOH�M��VH�HMHFXWD�����������Q Q�Q������YHFHV��2�Q��
❚ 7RWDO�
❙ 2�Q��2�Q��2�Q�� �2�Q��
❙ 2UGHQ�FXDGUiWLFR
21
Copyright © 2001 [email protected] Java: Recursión y Complejidad / 41
2SWLPL]DFLyQ
❚ B[i]=(A[0]+...+A[i])/(i+1)
❚ B[i+1]=(A[0]+...+A[i]+A[i+1])/(i+2)
❚ B[i+1]=(B[i]*(i+1))+A[i+1]/(i+2)
Copyright © 2001 [email protected] Java: Recursión y Complejidad / 42
6ROXFLyQ��
❚ s=0for i=0 to (n-1) do
s=s+A[i]B[i]=s/(i+1)
return B
22
Copyright © 2001 [email protected] Java: Recursión y Complejidad / 43
6ROXFLyQ����$QiOLVLV
❚ 3DUWHV�
❙ ,QLFLDOL]DU�\�GHYROYHU�DUUD\�%��2�Q�
❙ ,QLFLDOL]DU�V��2���
❙ %XFOH�L��VH�HMHFXWD�Q�YHFHV
❚ 7RWDO�
❙ 2�Q��2����2�Q� 2�Q�
❙ 2UGHQ�OLQHDO