hero 0 Denunciar post Postado Setembro 17, 2007 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
Kandrade 7 Denunciar post Postado Setembro 17, 2007 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
hero 0 Denunciar post Postado Setembro 17, 2007 Mas eu não entendi o porque ela imprime os valores em decremento. :mellow: Compartilhar este post Link para o post Compartilhar em outros sites
Kandrade 7 Denunciar post Postado Setembro 17, 2007 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
hero 0 Denunciar post Postado Setembro 17, 2007 Começou a clarear para mim.Mas eu não entendi a questão do desempilhar, desculpe mas é um conceito novo para mim. Compartilhar este post Link para o post Compartilhar em outros sites
hinom 5 Denunciar post Postado Setembro 17, 2007 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
hero 0 Denunciar post Postado Setembro 17, 2007 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
hinom 5 Denunciar post Postado Setembro 17, 2007 sim hero. talvez seja um bug. eh bom reportar isso site do desenvolvedores e ver o que eles respondem sobre isso. http://bugs.php.net Compartilhar este post Link para o post Compartilhar em outros sites
Kandrade 7 Denunciar post Postado Setembro 17, 2007 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
hinom 5 Denunciar post Postado Abril 9, 2008 esse link é interessante para quem deseja participar de testes do php http://qa.php.net/write-test.php Compartilhar este post Link para o post Compartilhar em outros sites