Article image
Deryk Biotto
Deryk Biotto05/01/2023 14:04
Compartilhe

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.

Compartilhe
Comentários (2)
Luciano Rocha
Luciano Rocha - 05/01/2023 21:25

As funções recursivas são alternativas a loop e, posso estar errado, é menor o erro de criação em relação ao loop. Mas há desvantagens que uma delas que usa mais memória e é mais lenta. Ou seja, tanto tempo quanto recursos computacionais, a recursividade não é a melhor solução. Porém depende de cada caso e aplicação.

Alisson Machado
Alisson Machado - 05/01/2023 14:58

Muito obrigado! me ajudou bastante com isso!