Funções Recursivas, exemplo de uso
- #JavaScript
- #Lógica de Programação
Funções recursivas é uma mão na roda, imagine que queremos remover itens de uma lista ou array, pode ser que a primeira coisa que venha em mente é realizar um loop para verificar os itens com as condições que queremos remover, será que é simplesmente isso?
Para exemplificar o problema, imagine que temos uma lista com aqueles que já jogaram na seleção, queremos deixar apenas aqueles que ainda estão na ativa, vamos primeiro tentar resolver através de um loop, o experimento será em javascript:
const jogadores = [
{nome: "Neymar", ativo: true},
{nome: "Cafu", ativo: false},
{nome: "Kaká", ativo: false},
{nome: "Paquetá", ativo: true},
{nome: "Richarlison", ativo: true}];
// Remover jogadores fora da Ativa
for (var i = 0; i< jogadores.length; i++) {
if (!jogadores[i].ativo) jogadores.splice(i,1);
}
document.getElementById("demo").innerHTML = jogadores.map( j => j.nome);
console.log(jogadores)
https://jsfiddle.net/derykroot/9phbeskj (implementação do código)
o resultado no log será:
[
{ nome: 'Neymar', ativo: true },
{ nome: 'Kaká', ativo: false },
{ nome: 'Paquetá', ativo: true },
{ nome: 'Richarlison', ativo: true }
]
Notamos que o laço em for removeu Cafu mas não Kaká, mas por quê? Simplesmente porque quando removemos Cafu o Kaká assumiu o lugar do Cafu, quando foi para o próximo item o Kaká não correspondia mais ao próximo índice, sendo assim, o laço não verificou Kaká.
Para esse problema podemos utilizar função recursiva ao invés de um laço de repetição:
const jogadores = [
{nome: "Neymar", ativo: true},
{nome: "Cafu", ativo: false},
{nome: "Kaká", ativo: false},
{nome: "Paquetá", ativo: true},
{nome: "Richarlison", ativo: true}];
// Remover jogadores fora da Ativa
function removeRecursive(items){
var idx = items.findIndex(reg => !reg.ativo);
if (idx>-1) {
items.splice(idx,1);
removeRecursive(items);
}
}
document.getElementById("demo").innerHTML = jogadores.map( j => j.nome);
console.log(jogadores)
https://jsfiddle.net/derykroot/1wn5L8yg/
o resultado agora será:
[
{ nome: 'Neymar', ativo: true },
{ nome: 'Paquetá', ativo: true },
{ nome: 'Richarlison', ativo: true }
]
Agora sim conseguimos remover os jogadores fora da ativa, a função removeRecursive verifica a condição e chama ela mesma para verificar a lista até não existir mais itens para remover.
Essa é apenas uma de muitas aplicações com funções recursivas.