• 0
Sign in to follow this  
ppgsalomao

Recursividade No Php

Question

Fala gente,

To com uma dúvida que tá me matando ...

Como usar a recursividade no PHP ??

Exemplo:

<?
function soma() {
    soma();
}
?>
Ou seja ... chamar a função dentro dela mesma ???? Eu tentei da seguinte forma:
<?
function soma() {
    while($acum == 1) {
        $acum = 0;
        a função
        if(/*condição para que ela recursive*/) {
            $acum = 1;
        }
    }
}
?>

Share this post


Link to post
Share on other sites

15 answers to this question

Recommended Posts

  • 0

Ih cara...não segredo acho...

Supondo-se um script q liste arquivos...

function listar_arquivos($path)
{
if arquivo{
imprimi na tela
} elseif diretorio {
Abre o diretorio e lista os arquivos de novo!
listar_arquivos(); //lista os arquivos dakele diretorio
}

Share this post


Link to post
Share on other sites
  • 0

MAs aih é que tah ...

Ele não chama novamente !! Ele no final não entra em um "Loop Forçado" ...

Ele simplismente só executa mais uma vez !!

O que eu preciso é que ele entre em um "loop forçado" !!

Share this post


Link to post
Share on other sites
  • 0

Não daria pra criar 2 funções separadas e chamar uma dentro da outra?

Por exemplo, vou copiar a sua função... claro que teria que adaptar como ela vai chamar cada parâmetro, mas eu pensei em algo assim:

<?php

function soma1() {

   while($acum == 1) {

       $acum = 0;

       a função

       if(/*condição*/) {

           $acum = 1;

       }

   }

}

function soma2() {

   while($acum == 1) {

       $acum = 0;

       a função

       if (/*condição para ela chamar a soma1()*/) {

           soma1();

           $acum = 1;

       }

   }

}

?>

Falou!

Share this post


Link to post
Share on other sites
  • 0

não dá pra pegar algum exemplo de java?? seique nessa linguagem tem recursividade.. as vezes com um exeplo dela fica mais facil!! biggrin.gif

Share this post


Link to post
Share on other sites
  • 0

Consegui!!!

Bom, pelo menos, acho eu... vai alterando os valores ali onde tá o número 1 pra você ver como tá funcionando.

<?php

function soma($x) {

    while ($x <= 10) {

        $x += 3;

        soma($x);

    }

    return $x;

}

echo soma(1);

******* EDITANDO *******

Ele simplismente só executa mais uma vez !!

O que eu preciso é que ele entre em um "loop forçado" !!

Não entendi essa parte! huh.gif

Share this post


Link to post
Share on other sites
  • 0
smile.gif

mas pra q você tah usando essa funcao??

Eu ou o Pedro??? hehehe

Bom, se for pra mim, eu só queria ver se conseguia criar uma função que chamasse ela mesma durante a sua execução... a princípio, achei que fosse essa a dúvida do Pedro. Mas como a solução foi simples, acho que deve ser outra coisa... por isso editei aquele meu tópico.

Abraços!

Share this post


Link to post
Share on other sites
  • 0

engraçado.. testei aki e não ententi a logica do negócio... faça isso aki:

<?php

function soma($x) {
    while ($x <= 10) {
        $x += 3;
        soma($x);
    }
    return $x;
}

echo soma(1)."<br>";
echo soma(2)."<br>";
echo soma(3)."<br>";
echo soma(4)."<br>";
echo soma(5)."<br>";
echo soma(6)."<br>";
echo soma(7)."<br>";
echo soma(8)."<br>";

?>

porque os resultados saum semelhantes entre os numeros?? não deveria ser para cada numero diferente???

me explica isso!!!!

biggrin.gifblink.gifwacko.gif

Share this post


Link to post
Share on other sites
  • 0
Fala Illidan !!

A resolução do while eu já tentei !!

Mas tah dando erro no meu PC e na net !!

Por isso perguntei !!

Ahhh, tá... mas qual erro tá dando?

/////////////////////////////

ffiction,

Esse resultado era esperado mesmo... você tem que ter em mente que, na primeira vez que o script encontrar a função return(), ele vai parar a execução da função e retornar o valor de $x. Então, naquele exemplo, quando que vai encontrar esse comando? Na primeira vez que a variável $x for maior que 10... e como ela vai aumentando de 3 em 3, vai retornar valores de 11 a 13 (isso se o valor inicial da variável for menor ou igual a 10). Entendeu?

Até mais! Abraços!

Share this post


Link to post
Share on other sites
  • 0
Fala Illidan !!

A resolução do while eu já tentei !!

Mas tah dando erro no meu PC e na net !!

Por isso perguntei !!

Ahhh, tá... mas qual erro tá dando?

/////////////////////////////

ffiction,

Esse resultado era esperado mesmo... você tem que ter em mente que, na primeira vez que o script encontrar a função return(), ele vai parar a execução da função e retornar o valor de $x. Então, naquele exemplo, quando que vai encontrar esse comando? Na primeira vez que a variável $x for maior que 10... e como ela vai aumentando de 3 em 3, vai retornar valores de 11 a 13 (isso se o valor inicial da variável for menor ou igual a 10). Entendeu?

Até mais! Abraços!

Tá dando timeout no servidor...

De repente esse seu loop forçado vai dar timeout sempre... rolleyes.gif

Share this post


Link to post
Share on other sites
  • 0
Guest - Gustavo -

Talvez o exemplo mais clássico relativo à recursividade seja o da função "fatorial". Calcular o fatorial de um número significa multiplicá-lo por todos os números menores do que ele até 1. Um caso especial é o fatorial de zero, que vale 1. E não existe fatorial de números negativos.

Por exemplo, calcular o fatorial de 3 (representado matematicamente por 3!):

3! = 3 * 2 * 1 = 6

Calcular o fatorial de 4 (4!):

4! = 4 * 3 * 2 * 1 = 24

Calcular o fatorial de 5 (5!):

5! = 5 * 4 * 3 * 2 * 1 = 120

Continuando com um pouco dessa teoria, podemos calcular o fatorial de 4 da seguinte forma:

4! = 4 * (3 * 2 * 1) = 4 * 3!

E, da mesma forma, o fatorial de 5 pode ser calculado como:

5! = 5 * (4 * 3 * 2 * 1) = 5 * 4!

ou ainda:

5! = 5 * 4 * 3!

De uma forma geral, o fatorial de um número X é igual ao próprio número multiplicado pelo fatorial de X - 1, ou seja:

X! = X * (X - 1)!

Isso quer dizer que para calcularmos o fatorial de um número (exceto 1 e 0, já que 1! = 1 e 0! = 1), precisamos calcular o fatorial de números menores que ele.

Uma função que calcule o fatorial pode (assim como muitas outras) ser codificada utilizando apenas estruturas de repetição. Mas como o assunto aqui é recursividade, vamos lá.

<?php

fatorial ($num) {

if ($num <= 1) {

return (1);

}

else {

return ($num * fatorial ($num - 1));

}

}

?>

Chamando a função "fatorial" utilizando zero ou 1 como parâmetro, ela vai retornar 1.

Com qualquer outro número (maior que 1), ela vai retornar o valor do número multiplicado pelo valor do fatorial desse mesmo número subtraído de 1.

Enquando esse número for maior do que 1, a função vai sendo chamada recursivamente. Quando a chamada for feita com o número 1, a função simplesmente retorna (sem chamar a si mesma), e o cálculo é realizado.

Podemos ilustrar esse processo assim:

fatorial (4) = 4 * fatorial (3)

fatorial (3) = 3 * fatorial (2)

fatorial (2) = 2 * fatorial (1)

fatorial (1) = 1

Nesse ponto, a função retorna o valor 1. E temos

fatorial (2) = 2 * 1 (já que fatorial (1) já foi calculado)

fatorial (3) = 3 * 2 (já que fatorial (2) já foi calculado)

fatorial (4) = 4 * 6 (já que fatorial (4) já foi calculado)

ou seja, fatorial (4) = 24

Um erro muito comum ao utilizar recursividade é esquecer de ter uma condição de interrupção, ou seja, uma condição dentro da função para que ela pare de chamar-se a si mesma. Esse erro faz com que a função nunca retorne.

Share this post


Link to post
Share on other sites
  • 0

Eu entendi Gustavo !!

O problema é simplismente que ele não chega a rodar !!

Eu consegui uma solução ... que é:

do {

    $acum = "b";

    if(condição para interromper) {

        $acum = "a";

    }

} while($acum == "b");

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this