Jump to content

Recommended Posts

Posted

Boa noite,

Estou a estudar o funcionamento de funções recursivas só que nao percebo bem como é que elas funcionam será que alguem me pode dar umas dicas? Tenho a seguinte função

:

int rec(int p)
{
if (p < 1)
return 0;
else
return p + rec(n / 2);
}

Eu não consigo perceber o seu funcionamento. Imagenos que ela recebe um argumento p=10, como 10 nao e menor do que 1 vai parar ao else, e agora o que eu nao sei é se ela retorna logo o valor p e depois vai executar a função outra vez ou se só retorna no final.

Outra duvida é no ultimo caso quando o p toma o valor 0 quando ela vai retornar vai retornar para onde? Para a linha onde foi invocada?

Posted
void forPrintRecursFront(int num)
{
 if(num<1)
 return;
 forPrintRecurs(num-1);
 printf("%d\n",num);
}

void forPrintRecursBack(int num)
{
 if(num<1)
 return;
 printf("%d\n",num);
 forPrintRecurs(num-1);
}

Ve se consegues perceber estas 2 funcoes.

Eu não consigo perceber o seu funcionamento. Imagenos que ela recebe um argumento p=10, como 10 nao e menor do que 1 vai parar ao else, e agora o que eu nao sei é se ela retorna logo o valor p e depois vai executar a função outra vez ou se só retorna no final.

Isso chama-se stack ou pilha.

Uma pilha é uma estrutura de dados que implementa a filosofia LIFO(Last In, First Out), ou seja, o último item a ser inserido na pilha é o primeiro a poder ser retirado, pois é o que se encontra por “cima”.

Basicamente uma funcao recursiva a primeira funcao ira' a ser a primeira a ser inserida na stack do programa e depois as outras irao ficar no topo, depois quando o p<1 for verdadeiro a pilha ira se esvaziar.

  • Vote 1

Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Posted

primeiro, vou assumir que te enganaste e usaste a variavel 'n' em vez da 'p'

segundo, uma maneira de perceber como isso funciona é assim

pega no códido da função e "espeta" no lugar da chamada da função:

int rec(int p)
{
 if (p < 1)
   return 0;
 else
   return p + rec(n / 2);
}

// primeira troca
int rec(int p)
{
 if (p < 1)
   return 0;
 else
   return p + (// dentro destes parênteses, onde aparece 'p' será trocado pelo p/2 (argumento da função)
               if ((p/2) < 1)  
                 return 0;
               else
                 return (p/2) + rec((p/2)/2); // p/2/2 = p/4
               );
}

// segunda troca
int rec(int p)
{
 if (p < 1)
   return 0;
 else
   return p + (// dentro destes parênteses, onde aparece 'p' será trocado pelo p/2 (argumento da função)
               if ((p/2) < 1)  
                 return 0;
               else
                 return (p/2) + (// dentro destes parênteses, onde aparece 'p' será trocado pelo p/4 (argumento da função)
                                 if ((p/4) < 1)  
                                   return 0;
                                 else
                                   return (p/4) + rec((p/4)/2); // p/4/2 = p/8
                                 );
               );
}

// e por ai a diante ...

espero que agora percebas como funciona uma função recursiva e qual a resposta a:

se ela retorna logo o valor p e depois vai executar a função outra vez ou se só retorna no final.

e

Outra duvida é no ultimo caso quando o p toma o valor 0 quando ela vai retornar vai retornar para onde? Para a linha onde foi invocada?

outra maneira de visualizar a resposta a estas perguntas é esta (e bastante simples)

int rec(int p)
{
 if (p < 1)
   return 0;
 else
   return (p + rec(p / 2)); // meti os parenteses extra mas é como se não tivessem lá
}

os parenteses dizem que primeiro resolve o que está dentro, e como o que está dentro é toda a expressão "p+rec(p/2)", logo sabes que primeiro é chamada a função, o resultado somado a 'p' e só depois retornado

  • Vote 1
IRC : sim, é algo que ainda existe >> #p@p
Posted

Obrigado aos dois pelas respostas. Vamos ver se eu percebi. Da primeira vez que a função é chamada com o p=10 ela vai guardar na pilha o valor de 10 certo? Só depois quando chega a p<1 é que ela vai tirando os valores da pilha para os somar. É isto ?

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.