Recursão na estrutura de dados: como funciona, tipos e quando usado

Publicados: 2020-05-22

Vamos começar com a definição de recursão na estrutura de dados. Discutiremos posteriormente diferentes tipos de recursão e como a recursão é usada para resolver diferentes problemas.

Índice

O que é recursão?

Em palavras simples, a recursão é uma solução de problemas e, em alguns casos, uma técnica de programação que possui uma propriedade muito especial e exclusiva. Na recursão, uma função ou método tem a capacidade de chamar a si mesmo para resolver o problema. O processo de recursão envolve resolver um problema transformando-o em variedades menores de si mesmo.

O processo no qual uma função chama a si mesma pode acontecer direta ou indiretamente. Essa diferença na chamada dá origem a diferentes tipos de recursão, sobre os quais falaremos um pouco mais adiante. Alguns dos problemas que podem ser resolvidos usando recursão incluem DFS of Graph, Towers of Hanoi, Different Types of Tree Traversals e outros. Para aprender sobre recursão e outros conceitos de ciência de dados, confira os cursos online de ciência de dados do IIIT-B.

Leia: 13 ideias interessantes de projetos de estrutura de dados

Como funciona a recursão?

O conceito de recursão é estabelecido na ideia de que um problema pode ser resolvido com muita facilidade e em menor tempo se for representado em uma ou versões menores. Adicionar condições básicas para interromper a recursão é outra parte importante do uso desse algoritmo para resolver um problema.

Nenhuma experiência de codificação necessária. Suporte de carreira 360°. Diploma PG em Machine Learning & AI do IIIT-B e upGrad.

As pessoas muitas vezes acreditam que não é possível definir uma entidade em termos de si mesma. A recursão prova que essa teoria está errada. E se essa técnica for realizada da maneira correta, poderá produzir resultados muito poderosos. Vamos ver como a recursão funciona com alguns exemplos. O que é uma sentença? Pode ser definido como duas ou mais frases unidas com a ajuda da conjunção. Da mesma forma, uma pasta pode ser um dispositivo de armazenamento usado para armazenar arquivos e pastas. Um antepassado pode ser um pai de um e um antepassado de outro membro da família na árvore genealógica.

A recursão ajuda a definir situações complexas usando algumas palavras muito simples. Como você normalmente definiria um ancestral? Um pai, um avô ou um bisavô. Isso poderia continuar. Da mesma forma, definir uma pasta pode ser uma tarefa difícil. Pode ser qualquer coisa que contenha alguns arquivos e pastas que podem ser arquivos e pastas por si só, e isso pode continuar. É por isso que a recursão torna a definição de situações muito mais fácil do que o habitual.

A recursão também é uma técnica de programação boa o suficiente. Uma sub-rotina recursiva é definida como aquela que direta ou indiretamente chama a si mesma. Chamar uma sub-rotina diretamente significa que a definição da sub-rotina já possui a instrução de chamada de chamada da sub-rotina que foi definida.

Por outro lado, a chamada indireta de uma sub-rotina acontece quando uma sub-rotina chama outra sub-rotina, que então chama a sub-rotina original. A recursão pode usar algumas linhas de código para descrever uma tarefa muito complexa. Vamos agora voltar nossa atenção para os diferentes tipos de recursão que já abordamos.

Leia também: As 6 principais linguagens de programação para aprender

Tipos de recursão

Existem apenas dois tipos de recursão, como já foi mencionado. Vamos ver como eles são diferentes um do outro. A recursão direta é a maneira mais simples, pois envolve apenas uma única etapa de chamada da função ou método original ou sub-rotina. Por outro lado, a recursão indireta envolve várias etapas.

A primeira chamada é feita pelo método original para um segundo método, que por sua vez chama o método original. Essa cadeia de chamadas pode apresentar vários métodos ou funções. Em palavras simples, podemos dizer que sempre há uma variação na profundidade da recursão indireta, e essa variação na profundidade depende do número de métodos envolvidos no processo.

A recursão direta pode ser usada para chamar apenas uma única função. Por outro lado, a recursão indireta pode ser usada para chamar mais de um método ou função com a ajuda de outras funções, e isso também, várias vezes. A recursão indireta não gera sobrecarga, enquanto sua contraparte direta o faz.

Quando a recursão é usada?

Há situações em que você pode usar recursão ou iteração. No entanto, você deve sempre escolher uma solução que pareça ser a mais natural para um problema. Uma recursão é sempre uma opção adequada quando se trata de abstração de dados. As pessoas costumam usar definições recursivas para definir dados e operações relacionadas.

E não será errado dizer que a recursão é principalmente a solução natural para problemas associados à implementação de diferentes operações em dados. No entanto, existem certas coisas relacionadas à recursão que podem não torná-la a melhor solução para todos os problemas. Nessas situações, uma alternativa como o método iterativo é a mais adequada.

A implementação da recursão usa muito espaço de pilha, o que muitas vezes pode resultar em redundância. Toda vez que usamos recursão, chamamos um método que resulta na criação de uma nova instância desse método. Essa nova instância carrega diferentes parâmetros e variáveis, que são armazenados na pilha e são levados no retorno. Portanto, embora a recursão seja a solução mais simples do que outras, geralmente não é a mais prática.

Além disso, não temos um conjunto de regras pré-definidas que possam ajudar a escolher iteração ou recursão para diferentes problemas. O maior benefício de usar a recursão é que é um método conciso. Isso torna a leitura e manutenção das tarefas mais fáceis do que o habitual. Mas os métodos recursivos não são os métodos mais eficientes disponíveis para nós, pois ocupam muito espaço de armazenamento e consomem muito tempo durante a implementação.

Ter em mente algumas coisas pode ajudá-lo a decidir se escolher uma recursão para um problema é o caminho certo a seguir ou não. Você deve escolher a recursão se o problema que você vai resolver for mencionado em termos recursivos e a solução recursiva parecer menos complexa.

Você deve saber que a recursão, na maioria dos casos, simplifica a implementação dos algoritmos que você deseja usar. Agora, se as complexidades associadas ao uso de iteração e recursão são as mesmas para um determinado problema, você deve optar pela iteração, pois as chances de ser mais eficiente são maiores.

Confira também: 23 melhores cursos de programação de computador para conseguir um emprego

Conclusão

No entanto, pode haver situações em que tomar uma decisão pode não ser tão fácil. Você tem que escolher entre eficiência e simplicidade. Se você é um designer experiente, saberia exatamente quando dar mais importância à eficiência e quando optar pela simplicidade ou concisão é o caminho a seguir.

Se você está curioso para aprender sobre estrutura de dados, ciência de dados, confira o Programa PG Executivo em Ciência de Dados do IIIT-B & upGrad, criado para profissionais que trabalham e oferece mais de 10 estudos de caso e projetos, workshops práticos práticos, orientação com a indústria especialistas, 1-on-1 com mentores do setor, mais de 400 horas de aprendizado e assistência de trabalho com as principais empresas.

Qual é a aplicação mais comum da recursão na vida real?

A recursão é um processo no qual a função chama a si mesma indiretamente ou diretamente para resolver o problema. A função que executa o processo de recursão é chamada de função recursiva. Existem certos problemas que podem ser resolvidos facilmente com a ajuda de um algoritmo recursivo.

A aplicação mais comum da recursão na vida real é quando você está calculando quanto dinheiro você tem em uma caixa cheia de Rs. 100 notas. Se houver muitas notas, você pode pedir ao seu amigo para fazer o mesmo trabalho, dividindo a pilha inteira em duas. Assim que ambos terminarem de contar, basta somar os dois resultados para obter o valor total.

Quais são as propriedades que uma função recursiva deve ter?

Uma função recursiva tem a capacidade de continuar como um loop infinito. Existem duas propriedades que devem ser definidas para qualquer função recursiva para evitar que ela entre em um loop infinito. Eles estão:

1. Critérios básicos – Deve haver uma condição básica predefinida. Sempre que esse critério básico for atendido, a função deixará de chamar a si mesma.
2. Abordagem progressiva – As chamadas recursivas devem consistir em uma abordagem progressiva. Sempre que uma chamada recursiva é feita para a função, ela deve estar chegando perto da condição base.

Quais são as vantagens e desvantagens da recursão?

Algumas das vantagens da recursão são que você só precisa definir a condição base e o caso recursivo em uma função recursiva. Isso torna o código bastante simples e curto em comparação com um código iterativo, e alguns problemas como Tree Traversal e Graph são inerentemente recursivos.

As maiores desvantagens da recursão são que há maiores requisitos de espaço para funções recursivas em comparação com um programa iterativo porque cada chamada de função deve permanecer na pilha até que a condição base seja atendida, e também há maiores requisitos de tempo, porque a pilha cresce após cada chamada de função, e a resposta final só pode ser retornada após remover todos os elementos da pilha.