O que é uma chamada recursiva?
Na programação, uma chamada recursiva é um comando dentro de uma sub-rotina ou função que informa ao programa para executar a mesma sub-rotina novamente. O desempenho de repetição pode ser o resultado direto da função ou uma segunda função pode ser acionada que, por sua vez, remete à primeira função. Uma chamada recursiva tem algumas semelhanças com o temido loop infinito, mas a sub-rotina sempre possui uma instrução condicional que informa ao programa quando parar de repetir a recursão.
O conceito de recursão talvez seja melhor ilustrado pelo uso de um exemplo. Suponha que um carpinteiro esteja aplicando novas telhas em uma casa. Para começar, ele deve levar um pacote de telhas para o telhado. Depois de pregar o primeiro pacote no lugar, ele deve descer a escada, recuperar outro pacote e pregar no lugar. O processo continua como uma série de "ir, buscar, retornar" até que a última telha tenha sido aplicada. Nesse ponto, o carpinteiro está livre para passar para o próximo emprego ou voltar para casa.
Embora o exemplo seja uma simplificação excessiva, ele contém todos os elementos de uma chamada recursiva. Há um ponto de partida: o carpinteiro deve recuperar o que precisa, retornar ao início e, quando a condição final for atendida, parar. Isso é basicamente o que o programa faz; ele inicia, implementa uma ação, retorna para si mesmo e termina quando a condição final ocorre.
A condição final é referida como o caso base. É essencial para todas as chamadas recursivas; sem ele, a função continuaria repetindo. Na melhor das hipóteses, isso resulta na drenagem dos recursos de memória do sistema. Normalmente, a sobrecarga trava o programa em algum momento, mas quando o problema é descoberto, danos significativos podem ser causados.
Programadores experientes podem reconhecer a semelhança entre uma chamada recursiva e um loop "for" ou "while". Se, por exemplo, o objetivo é encontrar a contagem total de estoque de todo o estoque com números de peça maiores que 999, um loop "for" instrui o programa a localizar todas as instâncias qualificadas e um loop "while" instrui o programa a executar o loop somente enquanto a condição declarada for válida. Pode-se dizer que uma chamada recursiva combina alguns dos recursos desses loops com uma declaração "if-then-else"; se essa condição for verdadeira, faça-o ou faça algo diferente se a condição for falsa. A recursão normalmente permite um código mais compacto, no entanto, e permite que o problema seja passado para a função mais próximo do ponto em que é necessário.