Recursividade: Que Geringonça é essa?

Se você trabalha com Desenvolvimento de Softwares ou até mesmo Websites, provavelmente já ouviu o termo em algum momento. Mas, qual a definição luso-brasileira desta palavra? O Google diz que recursividade é:

“[…]Propriedade das regras gramaticais que se podem reaplicar sucessivamente às estruturas resultantes de sua aplicação anterior, explicando assim o conceito teórico de sentença infinitamente longa, no plano da competência linguística.”

Então Recursividade é uma propriedade aplicável, sucessivas vezes às resultantes de sua aplicação anterior. Trazendo a definição do conceito linguístico até a programação, quando construímos uma Função Recursiva, devemos saber que ela será executada N vezes, dependendo de uma condição de saída ou estado anterior do elemento. A forma como este tipo de Função é executada, cria um laço de repetição se o uso de comandos como While, For ou Foreach. Para o nosso exemplo, realizaremos uma Função para encontrar uma Chave em N gavetas. Crie um arquivo chamado index.php (ou o nome que preferir) e coloque-o no diretório do Webserver de sua preferência.

No Escopo Principal da nossa rotina temos:

$gavetas = array (
 1 => false,
 2 => false,
 3 => false,
 4 => false,
 5 => true,
 6 => false,
 7 => false,
 8 => false,
 9 => false,
 10 => false,
);

Aqui informamos ao compilador (servidor) que a variável $gavetas irá receber um Array (Vetor) de dez posições, começando do índice 1.

Ainda no Escopo Principal, após a declaração do Array de Gavetas, temos:

echo encontraChave($gavetas, 1);


Aqui imprimimos a saída da função recursiva, ao mesmo tempo que a invocamos. O primeiro Parâmetro é o Array, o segundo representa a primeira posição (ou gaveta) a ser procurada.

No Protótipo de nossa Função Recursiva temos:

function encontraChave($gavetas, $gav){
 if ($gavetas[$gav] == false){
  $gav ++;
 return encontraChave($gavetas, $gav);
 }else{
  return $gav;
 }
}

Cada vez que a Função encontraChave é executada, e a condição $gavetas[$gav] == false é atendida, a variável $gav é incrementada e a Função é chamada novamente, criando uma nova instância e percorrendo o vetor $gavetas por completo, em quanto true não for encontrado. Se $gavetas[$gav] == true, a função retorna $gav, ou seja, a posição onde a chave foi encontrada.

Experimente trocar a chave de gaveta, definindo true para a posição desejada. É possível acrescentar quantas gavetas forem necessárias, basta adicionar as linhas de declaração do Vetor:

$gavetas = array (
1 => false,
2 => false,
.
.
.
99 => false,
100 => false,
);

Lembre-se que pelo menos uma posição do Vetor deve conter true, caso contrário a rotina entrará em loop infinito. Várias instâncias da Função são empilhadas, até o momento em que a condição de saída seja atendida. Neste momento, $gav é retornada para TODAS as instâncias já criadas. Com finalidade de teste, troque o trecho de declaração do Array por:

for($g = 0; $g<1000; $g++){
    $gavetas[$g] = false;
}

$gavetas[950] = true;

Aqui atribuímos false para 1000 gavetas e true para a gaveta de número 950. Note que o resultado impresso na tela será o mesmo de antes, só que neste momento, nossa função procurou pela chave em 1000 gavetas, 10 não mais.

Espero ter ajudado a entender mais sobre Funções Recursivas e o seu funcionamento. Acompanhe o EscolaWeb e Siga o GreenLabsWeb nas Redes Sociais. Só assim podemos continuar criando conteúdo gratuito e de qualidade, fazendo da Internet um mundo melhor.