24
Recursividade na Recursividade na Linguagem C Linguagem C

Recursividade linguagem c

Embed Size (px)

DESCRIPTION

recursividade em c

Citation preview

  • Recursividade na Recursividade na

    Linguagem CLinguagem C

  • FunFuno Recursivao Recursiva

    FunFuno recursiva o recursiva aquela que chama a si aquela que chama a si prprpria. Uma funpria. Uma funo podero poder tambtambm ser m ser considerada recursiva se chamar outras funconsiderada recursiva se chamar outras funes es que, em algum momento, chamem a primeira que, em algum momento, chamem a primeira funfuno, tornando esse conjunto de funo, tornando esse conjunto de funes um es um processo recursivo.processo recursivo.

  • As funAs funes recursivas so em sua maioria es recursivas so em sua maioria solusolues mais elegantes e simples, se es mais elegantes e simples, se comparadas a funcomparadas a funes tradicionais ou iterativas, es tradicionais ou iterativas, jj que executam tarefas repetitivas sem utilizar que executam tarefas repetitivas sem utilizar nenhuma estrutura de repetinenhuma estrutura de repetio, como o, como forfor ou ou whilewhile. Por. Porm essa elegncia e simplicidade m essa elegncia e simplicidade tm um pretm um preo que requer muita ateno que requer muita ateno em sua o em sua implementaimplementao.o.

  • Trazendo a recursividade para o nosso cotidiano Trazendo a recursividade para o nosso cotidiano um um timo exemplo esttimo exemplo est na ana ao de contar um o de contar um saco de moedas, onde a cada ato de retirar uma saco de moedas, onde a cada ato de retirar uma moeda do saco precisamoeda do saco precisa--se se contar dinheirocontar dinheiro que que corresponde a identificar qual corresponde a identificar qual o valor da o valor da moeda e sommoeda e som--la la quantia que ainda estquantia que ainda est no no saco. saco.

  • Para identificar a quantia que ainda estPara identificar a quantia que ainda est no no saco basta chamar a mesma funsaco basta chamar a mesma funo o contar contar dinheirodinheiro novamente, pornovamente, porm dessa vez jm dessa vez jconsiderando que essa moeda no estconsiderando que essa moeda no est mais lmais l. . E este processo de retirar uma moeda, E este processo de retirar uma moeda, identificar seu valor e somar com o restante do identificar seu valor e somar com o restante do saco se repete atsaco se repete at que o saco esteja vazio, que o saco esteja vazio, quando atingiremos o ponto de parada e a quando atingiremos o ponto de parada e a funfuno retornaro retornar o valor zero, indicando que o valor zero, indicando que no hno h mais moedas no saco. mais moedas no saco.

  • Nesse ponto a funNesse ponto a funo o contar dinheirocontar dinheiro foi foi chamada um nchamada um nmero de vezes igual a mero de vezes igual a quantidade de moedas no saco, e a quantidade de moedas no saco, e a ltima ltima chamada comechamada comea a devolver os valores de a a devolver os valores de retorno de cada instncia da funretorno de cada instncia da funo, iniciando o, iniciando por zero (saco vazio), somado ao valor da por zero (saco vazio), somado ao valor da ltima moeda, da penltima moeda, da penltima, etc, atltima, etc, at retornar retornar primeira chamada referente a primeira moeda, primeira chamada referente a primeira moeda, e nesse momento a fune nesse momento a funo inicial se encerra o inicial se encerra trazendo como valor de retorno a soma dos trazendo como valor de retorno a soma dos valores de todas as moedas que estavam no valores de todas as moedas que estavam no saco.saco.

  • Uma funUma funo pode chamar a si pro pode chamar a si prpria por um pria por um nnmero limitado de vezes. Esse limite mero limitado de vezes. Esse limite dado dado pelo tamanho da pilha (que poderpelo tamanho da pilha (que poder ser melhor ser melhor compreendido apcompreendido aps a apresentas a apresentao do trabalho o do trabalho do grupo B). Se o valor correspondente ao do grupo B). Se o valor correspondente ao tamanho mtamanho mximo da pilha for atingido, haverximo da pilha for atingido, haverum estouro da pilha ou um estouro da pilha ou StackStack OverflowOverflow. No . No conseguimos resultados muito conclusivos na conseguimos resultados muito conclusivos na avaliaavaliao desse estouro de pilha nos testes o desse estouro de pilha nos testes realizados, porrealizados, porm deu pra perceber num m deu pra perceber num programa para gerar uma seqprograma para gerar uma seqncia de ncia de FibonacciFibonacci com valores grandes, que o programa com valores grandes, que o programa estava usando acima de 90% dos recursos da estava usando acima de 90% dos recursos da CPU, o que demonstra como CPU, o que demonstra como pesado para o pesado para o computador realizar uma tarefa recursiva.computador realizar uma tarefa recursiva.

  • Cada vez que uma funCada vez que uma funo o chamada de forma chamada de forma recursiva, so alojados e armazenados uma recursiva, so alojados e armazenados uma ccpia dos seus parmetros, de modo a no pia dos seus parmetros, de modo a no perder os valores dos parmetros das chamadas perder os valores dos parmetros das chamadas anteriores. Em cada instncia da funanteriores. Em cada instncia da funo, so, s so so diretamente acessdiretamente acessveis os parmetros criados veis os parmetros criados para esta instncia, no sendo posspara esta instncia, no sendo possvel acessar vel acessar os parmetros das outras instncias. os parmetros das outras instncias.

  • A informaA informao armazenada na chamada de uma o armazenada na chamada de uma funfuno o designada por estrutura de invocadesignada por estrutura de invocao o ou registro de ativaou registro de ativao e consiste basicamente o e consiste basicamente na seguinte informana seguinte informao: o:

  • EndereEndereo de retorno (quando a funo de retorno (quando a funo o terminar o programa deve continuar a sua terminar o programa deve continuar a sua execuexecuo na linha seguinte o na linha seguinte invocainvocao da o da funfuno)o)

    Estado dos registros e Estado dos registros e flagsflags da CPUda CPU

    VariVariveis passadas como argumentos para a veis passadas como argumentos para a funfuno (por valor, referncia, etc.) o (por valor, referncia, etc.)

    VariVarivel de retorno (por valor, referncia, vel de retorno (por valor, referncia, etc.) etc.)

  • A chamada a uma funA chamada a uma funo recursiva o recursiva igual igual chamada de uma funchamada de uma funo no recursiva, na qual o no recursiva, na qual necessnecessrio guardar uma rio guardar uma estrutura de estrutura de invocainvocaoo, sendo esta estrutura liberada depois , sendo esta estrutura liberada depois do fim da execudo fim da execuo da funo da funo e atualizao e atualizao do o do valor de retorno. valor de retorno.

  • FunFunes recursivas contem duas es recursivas contem duas

    partes fundamentais: partes fundamentais:

    Ponto de Parada ou CondiPonto de Parada ou Condio de Paradao de Parada: : que que o ponto onde a funo ponto onde a funo sero ser encerrada, encerrada, e e geralmente um limite superior ou inferior geralmente um limite superior ou inferior da regra geral.da regra geral.

    Regra GeralRegra Geral: : o mo mtodo que reduz a todo que reduz a resoluresoluo do problema atravo do problema atravs da invocas da invocao o recursiva de casos menores, que por sua vez recursiva de casos menores, que por sua vez so resolvidos pela resoluso resolvidos pela resoluo de casos ainda o de casos ainda menores pela prmenores pela prpria funpria funo, assim o, assim sucessivamente atsucessivamente at atingir o atingir o ponto de ponto de paradaparada que finaliza o mque finaliza o mtodo.todo.

  • Para se criar um algoritmo recursivo, devePara se criar um algoritmo recursivo, deve--se se primeiro procurar encontrar uma soluprimeiro procurar encontrar uma soluo de o de como o problema pode ser dividido em passos como o problema pode ser dividido em passos menores. Depois definir um ponto de parada. menores. Depois definir um ponto de parada. Em seguida, definir uma regra geral que seja Em seguida, definir uma regra geral que seja vvlida para todos os demais casos. Develida para todos os demais casos. Deve--se se verificar se o algoritmo termina, ou seja, se o verificar se o algoritmo termina, ou seja, se o ponto de parada ponto de parada atingido. Para auxiliar nessa atingido. Para auxiliar nessa verificaverificao, recomendao, recomenda--se criar uma se criar uma rvore de rvore de execuexecuo do programa, como um chins, o do programa, como um chins, mostrando o desenvolvimento do processo.mostrando o desenvolvimento do processo.

  • Todo processo recursivo requer recursos da Todo processo recursivo requer recursos da mmquina, tanto de tempo quando de espaquina, tanto de tempo quando de espao de o de memmemria. Uma medida no muito precisa ria. Uma medida no muito precisa desses recursos, mas suficientemente desses recursos, mas suficientemente til, til, baseiabaseia--se na se na ordem de crescimentoordem de crescimento, ela nos , ela nos permite caracterizar, de forma aproximada, o permite caracterizar, de forma aproximada, o consumo de recursos em funconsumo de recursos em funo da dimenso o da dimenso do problema. do problema.

  • DeveDeve--se utilizar a recursividade quando esta se utilizar a recursividade quando esta forma for a mais simples e intuitiva de forma for a mais simples e intuitiva de implementar uma soluimplementar uma soluo para a resoluo para a resoluo de o de um determinado problema. Se no for (simples um determinado problema. Se no for (simples e intuitiva), sere intuitiva), ser ento melhor empregar outros ento melhor empregar outros mmtodos no recursivos, tambtodos no recursivos, tambm chamados de m chamados de mmtodos iterativostodos iterativos..

  • AplicaAplicaes pres prticas de funticas de funes es

    recursivas na linguagem C recursivas na linguagem C

    Como primeiro exemplo de funComo primeiro exemplo de funo recursiva, o recursiva, vamos ver o cvamos ver o clculo de fatorial.lculo de fatorial.

  • FatorialFatorial1 1 -- //Recursividade na Linguagem C//Recursividade na Linguagem C

    2 2 -- //PRC //PRC -- Prof. Joo Prof. Joo

    3 3 -- //FATORIAL//FATORIAL

    4 4 -- ##includeinclude stdiostdio.h.h

    5 5 -- int fatorial(int x){int fatorial(int x){

    6 6 -- if(( x == 0 ) || ( x ==1))if(( x == 0 ) || ( x ==1))

    7 7 -- returnreturn 1;1;

    8 8 -- elseelse

    9 9 -- returnreturn(x * fatorial(x(x * fatorial(x--1));1));

    10 10 -- }}

    11 11 -- mainmain(){(){

    12 12 -- int num;int num;

    13 13 -- printfprintf("Entre com um n("Entre com um nmero: ");mero: ");

    14 14 -- scanfscanf("%d", &num);("%d", &num);

    15 15 -- printfprintf("O fatorial de %d ("O fatorial de %d %d.", num, fatorial(num));%d.", num, fatorial(num));

    16 16 -- } }

  • Chins FatorialChins Fatorial

    5!

    5*4!

    4*3!

    3*2!

    2*1!

    1*0!

    1

    120

    5*(24)

    4*(6)

    3*(2)

    2*(1)

    1*(1)

    1

  • FibonacciFibonacci1 1 -- //Recursividade na Linguagem C//Recursividade na Linguagem C

    2 2 -- //PRC //PRC -- Prof. Joo Prof. Joo

    3 3 -- //FIBONACCI //FIBONACCI

    4 4 -- ##includeinclude stdiostdio.h.h

    5 5 -- int int fibonaccifibonacci(int N) {(int N) {

    6 6 -- if( N == 1 )if( N == 1 )

    7 7 -- returnreturn 1;1;

    8 8 -- elseelse

    9 9 -- if( N == 2)if( N == 2)

    10 10 -- returnreturn 1;1;

    11 11 -- elseelse

    12 12 -- returnreturn((fibonaccifibonacci(N(N--1) + 1) + fibonaccifibonacci(N(N--2));2));

    13 13 -- }}

    14 14 -- mainmain() {() {

    15 15 -- int num, F;int num, F;

    16 16 -- printfprintf("Entre com um n("Entre com um nmero:mero: ");");

    17 17 -- scanfscanf("%d", &num);("%d", &num);

    18 18 -- printfprintf("A s("A srie de rie de FibonacciFibonacci para %d elementos para %d elementos ::\\n", num);n", num);

    19 19 -- for(F=1;F

  • Chins Chins FibonacciFibonacci

    5

    5-1

    5-2

    4

    3

    3-1 3-2

    2

    1

    1

    4-1 4-2

    2

    1

    3

    3-1 3-2

    2

    1

    1

  • SomatSomatriorio1 1 -- //Recursividade na Linguagem C//Recursividade na Linguagem C

    2 2 -- //PRC //PRC -- Prof. JooProf. Joo

    3 3 -- //SOMATORIO//SOMATORIO

    4 4 -- ##includeinclude stdiostdio.h.h

    5 5 -- int int somatoriosomatorio(int x) {(int x) {

    6 6 -- if( x == 1 )if( x == 1 )

    7 7 -- returnreturn 1;1;

    8 8 -- elseelse

    9 9 -- returnreturn(x + (x + somatoriosomatorio(x (x --1));1));

    10 10 -- }}

    11 11 -- mainmain() {() {

    12 12 -- int num;int num;

    13 13 -- printfprintf("Entre com um n("Entre com um nmero: ");mero: ");

    14 14 -- scanfscanf("%d", &num);("%d", &num);

    15 15 -- printfprintf("O somat("O somatrio de 0 atrio de 0 at %d %d %d.", num, %d.", num, somatoriosomatorio(num));(num));

    16 16 -- }}

  • Chins SomatChins Somatriorio

    5

    5+Somatorio(4-1)

    5+4+Somatorio(3-1)

    5+4+3+Somatorio(2-1)

    5+4+3+2+Somatorio(1-1)

    5+4+3+2+1+Somatorio(0)

    15

    5+10

    5+4+6

    5+4+3+3

    5+4+3+2+1

  • Conta DConta Dgitosgitos

    1 1 -- //Recursividade na Linguagem C//Recursividade na Linguagem C

    2 2 -- //PRC //PRC -- Prof. JooProf. Joo

    3 3 -- //CONTA DIGITOS//CONTA DIGITOS

    4 4 -- ##includeinclude stdiostdio.h.h

    5 5 -- int int digitosdigitos(int x) {(int x) {

    6 6 -- if( if( absabs(x) < 10 )(x) < 10 )

    7 7 -- returnreturn 1;1;

    8 8 -- elseelse

    9 9 -- returnreturn(1 + (1 + digitosdigitos(x/10));(x/10));

    10 10 -- }}

    11 11 -- mainmain() {() {

    12 12 -- int num;int num;

    13 13 -- printfprintf("Entre com um n("Entre com um nmero: ");mero: ");

    14 14 -- scanfscanf("%d", &num);("%d", &num);

    15 15 -- printfprintf("O n("O nmero de dmero de dgitos de %d gitos de %d %d.", num, %d.", num, digitosdigitos(num));(num));

    16 16 -- } }

  • Chins Conta DChins Conta Dgitosgitos

    123456

    1+digito(12345/10)

    1+1+digito(1234/10)

    1+1+1+digito(123/10)

    1+1+1+1+digito(12/10)

    1+1+1+1+1+digito(1,2/10)

    6

    1+1+4

    1+1+1+3

    1+1+1+1+2

    1+1+1+1+1+1

    1+1+1+1+1+1+digito(0,12/10)

    1+5