Tutorial PHP: Recursividade – Para entender recursividade é preciso entender recursividade

Tutorial PHP: Recursividade – Para entender recursividade é preciso entender recursividade

Recursividade

Para entender recursividade é preciso entender recursividade

Ainda falando de funções, existe um recurso chamado recursividade, este nome é dado quando ocorre uma chamada de determinada função a ela mesma, isso ocorre até que determinada condição seja atingida.

Antes de continuarmos, a sugestão de solução para o exercício proposto no post anterior:

https://gist.github.com/RodriAndreotti/7601ac3092062413af55c83442e2365b

Funciona de forma semelhante a um laço de repetição, porém a recursão tem um custo computacional mais elevado, ou seja, utiliza mais processamento e gasta mais tempo para ser executado, que um laço while (iteração ou laço de repetição), isso ocorre devido a necessidade de a função manter seu estado anterior para poder continuar de onde parou quando chamou novamente a função.

 

Todo problema computacional que faça uso de uma função recursiva pode ser substituído por um laço de repetição, porém existem problemas computacionais que são basicamente recursivos por definição, por exemplo, uma árvore de dados (que é uma estrutura de dados muito importante em programação), É possível conhecer árvores de dados aqui, e aqui. Vale a pena uma análise mais aprofundada do problema em foco para chegar a uma conclusão se o uso de uma função recursiva seria mais viável que uma iteração, este post do Stackoverflow Brasil trás uma discussão muito interessante sobre o tema.

 

Existem rotinas mais corriqueiras, onde a recursividade pode ser útil, a construção de um menu com níveis infinitos vindo do banco de dados, por exemplo, a ordenação de dados dentro de um array com subarrays ou objetos ou até mesmo o cálculo de um fatorial.

 

Tomando o exemplo do cálculo de um fatorial, este é por definição recursivo, veja a regra de negócio:

Suponhamos que precisemos do valor fatorial de 4!

O fatorial nada mais é do que o produto (multiplicação) de todos os números inteiros menores ao número informado, o código abaixo exemplifica o uso de uma função recursiva para resolver um fatorial:

<?php 
function calculaFatorial($numFatorial) 
{ 
    if($numFatorial <=1){ 
        $numFatorial = $numFatorial; 
    } else { 
        $numFatorial *= calculaFatorial($numFatorial-1); 
    } 
    return $numFatorial; 
} 

$num = 4; 
echo calculaFatorial($num);

 

 

O exemplo acima imprimirá na tela o valor 24, que é o fatorial de 4.

 

Condição de parada

É importante também ter definido de forma bem clara a condição para que esta função deixe de ser executada, caso contrário é possível que entremos em um loop infinito e causemos uma parada do sistema com um erro fatal, ou, dependendo das configurações do servidor web, travemos o servidor.

 

No exemplo acima, conseguimos notar que a função só chama a si mesma novamente caso a variável $numFatorial seja maior que 1, então, quando a variável atinge o valor 1, a função para de ser executada e o valor é retornado.

 

Considerações finais

Outra coisa a se levar em consideração é o custo computacional para a execução tanto das iterações quanto das funções recursivas, pois apesar de ambos conseguirem atingir o mesmo resultado, em determinados casos é mais viável o uso de uma função recursiva, e em outros é mais viável a iteração.

 

Este conceito também poderá sem aplicado mais adiante quando estivermos trabalhando com orientação a objetos.

 

Espero que este post tenha esclarecido um pouco o uso da recursividade.

Se o post foi útil, compartilhe, outras pessoas podem achar o post útil.

Sobre Rodrigo Teixeira Andreotti

Técnico em Informática formado pela ETEC Lauro Gomes Analista de Sistemas Pela universidade Metodista. Impacta Certified Specialist - Linux Programador PHP desde 2007, atuando em diversos projetos de sistemas internos, migrações, desenvolvimento de API's e sites públicos tanto como freelancer quanto com contrato com empresas. Também atuante como administrador Linux, administrando dois servidores próprios com CentOS, além de prestar serviços de administração e manutenção em servidores para algumas empresas.



Tutorial PHP: Recursividade – Para entender recursividade é preciso entender recursividade

Tutorial PHP: Recursividade – Para entender recursividade é preciso entender recursividade

Recursividade

Para entender recursividade é preciso entender recursividade

Ainda falando de funções, existe um recurso chamado recursividade, este nome é dado quando ocorre uma chamada de determinada função a ela mesma, isso ocorre até que determinada condição seja atingida.

Antes de continuarmos, a sugestão de solução para o exercício proposto no post anterior:

https://gist.github.com/RodriAndreotti/7601ac3092062413af55c83442e2365b

Funciona de forma semelhante a um laço de repetição, porém a recursão tem um custo computacional mais elevado, ou seja, utiliza mais processamento e gasta mais tempo para ser executado, que um laço while (iteração ou laço de repetição), isso ocorre devido a necessidade de a função manter seu estado anterior para poder continuar de onde parou quando chamou novamente a função.

 

Todo problema computacional que faça uso de uma função recursiva pode ser substituído por um laço de repetição, porém existem problemas computacionais que são basicamente recursivos por definição, por exemplo, uma árvore de dados (que é uma estrutura de dados muito importante em programação), É possível conhecer árvores de dados aqui, e aqui. Vale a pena uma análise mais aprofundada do problema em foco para chegar a uma conclusão se o uso de uma função recursiva seria mais viável que uma iteração, este post do Stackoverflow Brasil trás uma discussão muito interessante sobre o tema.

 

Existem rotinas mais corriqueiras, onde a recursividade pode ser útil, a construção de um menu com níveis infinitos vindo do banco de dados, por exemplo, a ordenação de dados dentro de um array com subarrays ou objetos ou até mesmo o cálculo de um fatorial.

 

Tomando o exemplo do cálculo de um fatorial, este é por definição recursivo, veja a regra de negócio:

Suponhamos que precisemos do valor fatorial de 4!

O fatorial nada mais é do que o produto (multiplicação) de todos os números inteiros menores ao número informado, o código abaixo exemplifica o uso de uma função recursiva para resolver um fatorial:

<?php 
function calculaFatorial($numFatorial) 
{ 
    if($numFatorial <=1){ 
        $numFatorial = $numFatorial; 
    } else { 
        $numFatorial *= calculaFatorial($numFatorial-1); 
    } 
    return $numFatorial; 
} 

$num = 4; 
echo calculaFatorial($num);

 

 

O exemplo acima imprimirá na tela o valor 24, que é o fatorial de 4.

 

Condição de parada

É importante também ter definido de forma bem clara a condição para que esta função deixe de ser executada, caso contrário é possível que entremos em um loop infinito e causemos uma parada do sistema com um erro fatal, ou, dependendo das configurações do servidor web, travemos o servidor.

 

No exemplo acima, conseguimos notar que a função só chama a si mesma novamente caso a variável $numFatorial seja maior que 1, então, quando a variável atinge o valor 1, a função para de ser executada e o valor é retornado.

 

Considerações finais

Outra coisa a se levar em consideração é o custo computacional para a execução tanto das iterações quanto das funções recursivas, pois apesar de ambos conseguirem atingir o mesmo resultado, em determinados casos é mais viável o uso de uma função recursiva, e em outros é mais viável a iteração.

 

Este conceito também poderá sem aplicado mais adiante quando estivermos trabalhando com orientação a objetos.

 

Espero que este post tenha esclarecido um pouco o uso da recursividade.

Se o post foi útil, compartilhe, outras pessoas podem achar o post útil.

Sobre Rodrigo Teixeira Andreotti

Técnico em Informática formado pela ETEC Lauro Gomes Analista de Sistemas Pela universidade Metodista. Impacta Certified Specialist - Linux Programador PHP desde 2007, atuando em diversos projetos de sistemas internos, migrações, desenvolvimento de API's e sites públicos tanto como freelancer quanto com contrato com empresas. Também atuante como administrador Linux, administrando dois servidores próprios com CentOS, além de prestar serviços de administração e manutenção em servidores para algumas empresas.