aula06-Recursividade
-
Upload
paul-dirac -
Category
Documents
-
view
215 -
download
0
Transcript of aula06-Recursividade
-
7/25/2019 aula06-Recursividade
1/29
Aula 6 -Recursividade
David Menotti
Algoritmos e Estruturas de Dados IDECOM UFOP
-
7/25/2019 aula06-Recursividade
2/29
Algoritmos e Estrutura David Menotti
Conceito de Recursividade
Fundamental em Matemtica e Cincia daComputao Um programa recursivo ! um programa "ue
c#ama a si mesmo Uma $uno recursiva ! de$inida em termos dela
mesma
E%emplos &'meros naturais( Funo $atorial( )rvore
Conceito poderoso De$ine con*untos in$initos com comandos$initos
Renato Ferreira
-
7/25/2019 aula06-Recursividade
3/29
Algoritmos e Estrutura David Menotti
Recursividade
A recursividade ! uma estrat!gia "ue pode ser utili+adasempre "ue o clculo de uma $uno para o valor n(pode ser descrita a partir do clculo desta mesma$uno para o termo anterior ,n-./0
Exemplo Funo fatorial:
n! = n * (n-1) * (n-2) * (n-3) *....* 1
(n-1)! = (n-1) * (n-2) * (n-3) *....* 1
logo:
n! = n * (n-1)!
-
7/25/2019 aula06-Recursividade
4/29
Algoritmos e Estrutura David Menotti
Recursividade
De$inio1 dentro do corpo de uma $uno(c#amar novamente a pr2pria $uno recurso direta1 a $uno A c#ama a pr2pria
$uno A recurso indireta1 a $uno A c#ama uma $uno
3 "ue( por sua ve+( c#ama A
-
7/25/2019 aula06-Recursividade
5/29
Algoritmos e Estrutura David Menotti
Condio de parada
&en#um programa nem $uno pode sere%clusivamente de$inido por si Um programa seria um loop in$inito
Uma $uno teria de$inio circular Condio de parada
Permite "ue o procedimento pare de se e%ecutar F(x)4 5 ondex! decrescente
O6*etivo Estudar recursividade como $erramentaprtica7
Renato Ferreira
-
7/25/2019 aula06-Recursividade
6/29
Algoritmos e Estrutura David Menotti
Recursividade
Para cada c#amada de uma $uno(recursiva ou no( os par8metros e asvariveis locais so empil#ados na pil#a dee%ecuo0
-
7/25/2019 aula06-Recursividade
7/29Algoritmos e Estrutura David Menotti
Execuo
Internamente( "uando "ual"uer c#amada de $uno! $eita dentro de um programa( ! criado umRegistro de Ativao na Pilha de Execuodoprograma
O registro de ativao arma+ena os par8metros evariveis locais da $uno 6em como o 9ponto deretorno: no programa ou su6programa "ue c#amouessa $uno0
Ao $inal da e%ecuo dessa $uno( o registro !desempil#ado e a e%ecuo volta ao su6programa"ue c#amou a $uno
-
7/25/2019 aula06-Recursividade
8/29Algoritmos e Estrutura David Menotti
Exemplo
Fat (int n) { if (n
-
7/25/2019 aula06-Recursividade
9/29Algoritmos e Estrutura David Menotti
Complexidade
A comple%idade de tempo do $atorial recursivo ! O,n/0,Em 6reve iremos ver a maneira de calcular issousando equaes de recorrncia/
Mas a comple%idade de espao tam6!m ! O,n/(devido a pil#a de e%ecuo
;a no $atorial no recursivoa comple%idade de
espao ! O,./
Fat (int n) {
int f;
f = 1;
!ile(n " 0){
f = f * n;
n = n # 1;
}
return f;
}
-
7/25/2019 aula06-Recursividade
10/29Algoritmos e Estrutura David Menotti
Recursividade
Portanto( a recursividade nem sempre ! amel#or soluo( mesmo "uando a de$iniomatemtica do pro6lema ! $eita em termosrecursivos
-
7/25/2019 aula06-Recursividade
11/29Algoritmos e Estrutura David Menotti
Fibonacci
Outro e%emplo1 Srie de Fibonacci: Fn< Fn-.= Fn-> n 4 >( F5< F.< .
.( .( >( ?( @( ( .?( >.( ?B( @@( 000
Fi$(int n) {
if (n
-
7/25/2019 aula06-Recursividade
12/29Algoritmos e Estrutura David Menotti
Anlise da funoFibonacci
Ine$icincia em Fi6onacci ermos Fn-.e Fn->so computados
independentemente &'mero de c#amadas recursivas < n'mero de
Fi6onacci7 Custo para clculo de Fn
O,n/ onde < ,. = @/> < .(.5?000
Golden ratio E%ponencial777
-
7/25/2019 aula06-Recursividade
13/29Algoritmos e Estrutura David Menotti
Fibonacci no recursivo
Comple%idade1 O,n/ Concluso1 no usar recursividade
cegamente7
int Fi$'ter(int n) {int i, , F;
i = 1; F = 0; fr ( = 1;
-
7/25/2019 aula06-Recursividade
14/29Algoritmos e Estrutura David Menotti
Quando vale a pena usarrecursividade
Gecursividade vale a pena para Algoritmoscomple%os( cu*a a implementao iterativa !comple%a e normalmente re"uer o usoe%plHcito de uma pil#a Dividir para Con"uistar ,E%0 uicJsort/ Camin#amento em )rvores ,pes"uisa(
6acJtracJing/
-
7/25/2019 aula06-Recursividade
15/29Algoritmos e Estrutura David Menotti
Dividir para Conuistar
Duas c#amadas recursivas Cada uma resolvendo a metade do pro6lema
Muito usado na prtica
Koluo e$iciente de pro6lemas Decomposio
&o se redu+ trivialmente como $atorial Duas c#amadas recursivas
&o produ+ recomputao e%cessiva como$i6onacci PorLes di$erentes do pro6lema
-
7/25/2019 aula06-Recursividade
16/29Algoritmos e Estrutura David Menotti
!utros exemplos derecursividade
void estrela(int x,int y, int r)
{
if ( r > 0 )
{
estrela(x-r, y+r, r div 2);
estrela(x+r, y+r, r div 2);
estrela(x-r, y-r, r div 2);
estrela(x+r, y-r, r div 2);
box(x, y, r);
}
}
-
7/25/2019 aula06-Recursividade
17/29Algoritmos e Estrutura David Menotti
Exemplo simples" r#$ua
int regua(int l,int r,int h)
{
int m;
if ( h > 0 )
{
m (l + r) ! 2; mar"a(m, h);
regua(l, m, h # $);
regua(m, r, h # $);
}
}
-
7/25/2019 aula06-Recursividade
18/29
Algoritmos e Estrutura David Menotti
Execuo" r#$uaregua(0, 8, 3)
marca(4, 3)
regua(0, 4, 2) marca(2, 2)
regua(0, 2, 1)
marca(1, 1)
regua(0, 1, 0)
regua(1, 2, 0)
regua(2, 4, 1) marca(3, 1)
regua(2, 3, 0)
regua(3, 4, 0)
regua(4, 8, 2)
marca(6, 2)
regua(4, 6, 1)
marca(5, 1) regua(4, 5, 0)
regua(5, 6, 0)
regua(6, 8, 1)
marca(7, 1)
regua(6, 7, 0)
regua(7, 8, 0)
-
7/25/2019 aula06-Recursividade
19/29
Algoritmos e Estrutura David Menotti
Anlise de Complexidade!
De$ine-se uma $uno de comple%idade $,n/descon#ecida n mede o taman#o dos argumentos para o
procedimento em "uesto
Identi$ica-se a equao de recorrncia ,n/: Especi$ica-se ,n/ como uma $uno dos termos
anteriores
Especi$ica-se a condio de parada ,e0g0 ,.//
-
7/25/2019 aula06-Recursividade
20/29
Algoritmos e Estrutura David Menotti
Anlise da Funo Fatorial
ual a e"uao de recorrncia "ue descrevea comple%idade da $uno $atorial,n/ < . = ,n-./
,./ < .
,n/ < . = ,n-./
,n-./ < . = ,n->/
,n->/ < . = ,n-?/
000,>/ < . = ,./
-
7/25/2019 aula06-Recursividade
21/29
Algoritmos e Estrutura David Menotti
Anlise de Fun%esRecursivas
Al!m da anlise de custo do tempo( deve-seanalisar tam6!m o custo de espao
ual a comple%idade de espao da $uno$atorial ,"ual o taman#o da pil#a dee%ecuo/
-
7/25/2019 aula06-Recursividade
22/29
Algoritmos e Estrutura David Menotti
Anlise da FunoRecursiva
Considere a seguinte $uno1
Pes"uisa,n/N
,./ i !n < 1),>/ inspecione elemento Q e termineR else
N
,?/ para cada um dos n elementos inspecione elementoQR,B/ Pes"uisa,n?/ R S
S
-
7/25/2019 aula06-Recursividade
23/29
Algoritmos e Estrutura David Menotti
Anlise da FunoRecursiva
ual a e"uao de recorrncia,n/ < n = ,n?/
,./ < .
Gesolva a e"uao de recorrncia Dicas1
Pode $a+er a simpli$icao de n ser sempredivisHvel por ? Komat2rio de uma PT $inita1 ,a5 rn/,.-r/
-
7/25/2019 aula06-Recursividade
24/29
Algoritmos e Estrutura David Menotti
Resolvendo a euao
Ku6stitui-se os termosT(k)(k?/ = .?n> X
i
-
7/25/2019 aula06-Recursividade
26/29
Algoritmos e Estrutura David Menotti
Exerc&cio
Crie uma $uno recursiva "ue calcula apotncia de um n'mero1 Como escrever a $uno para o termo n em
$uno do termo anterior
ual a condio de parada
ual a comple%idade desta $uno
-
7/25/2019 aula06-Recursividade
27/29
Algoritmos e Estrutura David Menotti
Funo de 'ot(nciaRecursivaint %ot(int base, int ex%)
{
if (&ex%)
return $;
!' else '! return (base'%ot(base, ex%-$));
}
nlise de "om%lexidade*
(0) $;
(b,n) $ + (b,n-$);
"!n#
-
7/25/2019 aula06-Recursividade
28/29
Algoritmos e Estrutura David Menotti
Exerc&cios
Implemente uma $uno recursiva paracomputar o valor de >n
O "ue $a+ a $uno a6ai%oidf(int a, int b) { !! "onsidere a > b
if(b 0)
returna;
else
returnf(b, a %b);
}
-
7/25/2019 aula06-Recursividade
29/29
Al it E t t David Menotti
Respostas
Algoritmo de Euclides0 Calcula o MDC
,m%imo divisor comum/ de dois n'merosa e 6
+t(int n) { if (n==0)
return 1;
else
return * +t(n-1);
}