aula06-Recursividade

download aula06-Recursividade

of 29

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);

    }