Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

hero

função recursiva -

Recommended Posts

Galera eu tava dando uma estudada em funções recursivas, eu entendi o funcionamento e talz, só que surgiu uma duvida. Quando eu coloco;

 

<?  function recursion($a){if ($a < 20) {echo "$a\n";recursion($a + 1);}}recursion(1);?>

O seguinte resultado é exibido:

 

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

 

Até ai tudo bem agora se eu colocar um echo para imprimir o valor da variável $a após a chamada da função....

 

 

<?  function recursion($a){if ($a < 20) {echo "$a\n";recursion($a + 1);echo "$a\n";                // Imprimindo na tela o valor de $a após a chamada da função.}}recursion(1);?>

O seguinte resultado aparece

 

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1

 

O que eu não entendo.:

 

Por que ele imprime 19 vezes o valor de $a após a chamada da função recursion, sendo que a condição do if já e falsa.

Por que ele imprime a variável $a decrementando.

 

Desde já agradeço. :rolleyes:

Compartilhar este post


Link para o post
Compartilhar em outros sites

A função fica parada aquirecursion($a + 1);até que ela se resolva. Ela se resolve quando $a é 20.Quando $a = 20 a função já imprimiu1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19Agora ela volta executando o que há abaixo da chamada recursiva. Portanto é ai que ela imprime isso:19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

para imprimir isso:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

 

As chamadas da função foi guardada numa pilha.

Repare que pra cada número desse foi necessario uma chamada de função.

 

Quando a recursividade se resolve ela vem desimpilhando todas as funções por isso o decremento.

Para a função que imprimiu 19 o valor de $a é 19.

Para a função que imprimiu 18 o valor de $a é 18.

e assim vai.

 

http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

muito interessante. nunca tinha feito isso

 

o que acontece ´´e o que o kandrade explicou.

 

<?php

function recursion($a){

if ($a < 20) {

echo "$a\n";

recursion($a + 1);

echo "$a\n";

// Imprimindo na tela o valor de $a após a chamada da função.

}

}

recursion(1);

?>

essa parte em negrito fica na pilha ate que a condicional seja false. quando isso ocorre a pilha eh liberada ao contrario.

Compartilhar este post


Link para o post
Compartilhar em outros sites

muito interessante. nunca tinha feito isso

 

o que acontece ´´e o que o kandrade explicou.

 

<?php

function recursion($a){

if ($a < 20) {

echo "$a\n";

recursion($a + 1);

echo "$a\n";

// Imprimindo na tela o valor de $a após a chamada da função.

}

}

recursion(1);

?>

essa parte em negrito fica na pilha ate que a condicional seja false. quando isso ocorre a pilha eh liberada ao contrario.

 

engraçado, mas esse comentario do hinom me ajudou também, mas e a questão da pilha ser liberada ao contrario, desculpe pela ignorância mas isso naum consume muita memoria? Pois para imprimir o valor de $a ao contrario esse valor já teria que estar na memoria, correto? Quando essa pilha seria destruída?

Compartilhar este post


Link para o post
Compartilhar em outros sites

engraçado, mas esse comentario do hinom me ajudou também, mas e a questão da pilha ser liberada ao contrario, desculpe pela ignorância mas isso naum consume muita memoria?

É característico das pilhas esse comportamento. A pilha é preenchida com as chamadas das funções até ser resolvida. Apartir dai a pilha comeca retornar as funcões até que a primeira chamada seja finalizada.Na pilha o último que entra é o primeiro que sai.O que consome mais memória é o fato da função ser armazenada na pilha. Numa função não recursiva apenas os argumentos são armazenados.

Pois para imprimir o valor de $a ao contrario esse valor já teria que estar na memoria, correto? Quando essa pilha seria destruída?

Esse valor está na pilha junto a função.A pilha será "destruída" quando o programa é finalizado.Não é bem "destruída" ela será desempilhada. http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.