O que é uma função recursiva e como você cria uma em Java?
A necessidade de repetir o código nunca pode ser subestimada na busca de soluções para alguns dos maiores problemas do mundo. O que você precisa saber é que, na programação, a repetição assume uma de duas formas – iteração ou recursão.
O objetivo aqui é apresentar a repetição no código e demonstrar como ela pode ser usada para aprimorar seus programas Java.
Os programas repetitivos podem ajudá-lo a resolver alguns dos problemas de programação mais difíceis. Aqui está o que você precisa saber para criar programas recursivos em Java.
Usando Iteração
A iteração usa uma estrutura de loop para repetir o código. Os três tipos de estruturas iterativas são loop de pré-teste (while), loop de pós-teste (do-while) e loop controlado por contador (for) .
Essas estruturas iterativas operam repetindo um bloco de código enquanto uma condição específica permanece verdadeira, mas assim que essa condição se torna falsa, o loop para e o programa retorna ao seu fluxo normal.
Por exemplo, poderíamos empregar uma das estruturas iterativas para resolver o problema da soma de todos os inteiros de 1 a n. Dependendo da estrutura iterativa usada, a solução assumirá uma forma específica, mas qualquer uma das três estruturas iterativas pode fornecer uma solução para esse problema usando o seguinte pseudocódigo.
Exemplo de pseudocódigo de iteração
START
DECLEARE sum, count as integer
sum = 0
count = 1
REPEAT
Sum = sum + count
Count = count + 1
UNTIL count > n
END
O pseudocódigo acima tem duas variáveis, soma e contagem, que são inicializadas com 0 e 1, respectivamente. A variável "count" é inicializada com 1 porque o problema que estamos tentando resolver afirma que precisamos da soma de todos os inteiros de 1 a n.
A variável "n" será atribuída a um número aleatório do usuário e a variável "contagem" aumentará em um cada vez que um loop for executado, mas assim que o valor da variável "contagem" exceder o de "n", então o loop irá parar.
Por que usar a recursão?
Se examinarmos os fatos que envolvem a iteração e a recursão, descobriremos que várias coisas são verdadeiras.
- Ambos os métodos envolvem repetição.
- Ambos os métodos requerem uma condição de teste, que indicará quando parar.
- Ambos os métodos podem teoricamente ser executados para sempre se uma condição de saída não for fornecida ou satisfeita.
- Qualquer problema que pode ser resolvido usando iteração também pode ser resolvido usando recursão e vice-versa.
Então, por que escolheríamos um método em vez do outro? A resposta simples é eficiência. Com a recursão, um programador pode usar menos código para atingir o que é essencialmente o mesmo resultado. Menos código significa que há uma diminuição significativa na possibilidade de erros passarem despercebidos.
A recursão usa mais memória e é mais lenta do que a iteração, mas tem uma pilha embutida (estrutura de dados). Com a iteração, você teria que construir uma estrutura de dados (essencialmente reinventando a roda), deixando seu programa aberto a uma possibilidade maior de erros não detectados devido ao código extra.
Como funciona a recursão
Recursão é o nome dado a um processo em que uma função se chama repetidamente até que uma condição específica seja atendida. Esse método repetitivo resolve problemas dividindo-os em versões menores e mais simples de si mesmos.
Cada função recursiva consiste em duas partes – caso base e caso geral.
Estrutura básica de um exemplo de função recursiva
Function(){
//base case
//general case
}
O caso base é a seção da função recursiva que resolve o problema. Portanto, sempre que a função recursiva chega ao caso base, o programa sai da função recursiva e continua com seu fluxo natural.
O caso geral é a seção da função recursiva que é repetitiva. É aqui que a função chama a si mesma e onde a maior parte do trabalho é realizada.
Usando recursão em Java
Algumas linguagens de programação suportam apenas iteração, enquanto outras suportam apenas recursão. Felizmente, Java é uma das linguagens que oferece suporte a ambos os métodos repetitivos.
Em Java, a recursão é usada da mesma maneira que em qualquer outra linguagem que a suporte. A chave é sempre garantir que sua função recursiva tenha uma base e um caso geral, nessa ordem.
Vamos voltar ao nosso exemplo de soma inicial, o objetivo é encontrar a soma de todos os inteiros de 1 a n, onde n é um número inteiro fornecido pelo usuário.
Exemplo de recursão Java
//recursive function
int Sum(int n){
//base case
if (n <= 1){
return 1;
}
//general case
else{
return n + Sum(n-1);
}
}
A função recursiva acima leva um inteiro “n” e só termina sua execução quando o valor de n é menor ou igual a 1.
Se tivéssemos que passar o inteiro 5 para o programa acima, a variável "n" assumiria o valor 5. O valor de “n” seria então verificado no caso base, mas dado que 5 é maior que 1 “n ”Agora será passado para o caso geral.
Neste exemplo, o caso geral chamará a função recursiva quatro vezes. Na chamada de função final, o valor de "n" será 1, atendendo efetivamente aos requisitos do caso base, resultando no encerramento da função recursiva e no retorno de 15.
Se alterarmos o valor de “n” para 7, a função recursiva se chamará seis vezes e retornará 28 antes de encerrar sua execução.
Quer experimentar por si mesmo? Você pode executar o programa recursivo acima usando a seguinte linha de código na função principal do seu programa Java.
System.out.println( Sum(7));
O que você aprendeu
Se você leu todo este artigo, agora tem um conhecimento básico dos dois métodos repetitivos usados na programação. Agora você reconhece as semelhanças entre iteração e recursão e por que um desenvolvedor escolheria usar recursão em vez de iteração e como usar uma função recursiva em Java.
Crédito da imagem: ThisIsEngineering / Pexels