7/100 Dias Estudando Estruturas de Dados - Percorrendo Matriz SEM for
Dada uma matriz
de tamanho N x M
, a tarefa é percorrer essa matriz usando recursão
.
Um pouco sobre recursividade
Recursividade é quando uma função
chama a si mesma.
exemplo:
void imprimirNome(int quantidadeDeVezes) {
if(quantidadeDeVezes > 0) {
cout << "Daniel Rodrigues" << endl;
imprimirNome(quantidadeDeVezes-1);
}
}
int main() {
imprimirNome(10);
return 0;
}
A cada chamada da função
é subtraído 1
da quantidade de vezes
, caso essa quantidade seja 0
o programa finaliza a execução da função
.
Percorrendo matriz
Vamos empregar recursividade para realizar essa tarefa.
codigo:
void percorrerVetor(vector<int>& vetor, int index = 0) {
if(index < vetor.size()) {
cout << vetor[index] << " ";
percorrerVetor(vetor, index+1);
}
}
void percorrerMatriz(vector<vector<int>>& matriz, int index = 0) {
if(index < matriz.size()) {
percorrerVetor(matriz[index]);
percorrerMatriz(matriz, index+1);
}
}
int main() {
vector<vector<int>> matriz = {{1, 2, 3}, {4, 5, 6}};
percorrerMatriz(matriz);
return 0;
}
Existem abordagens mais sofisticadas
para resolver esse problema, mas optei por uma solução
que seja compreensível
para qualquer pessoa
Extras
Um pouco mais sobre recursividade
: https://embarcados.com.br/recursividade/
Esse conteúdo é uma continuação do dia 5
: https://www.tabnews.com.br/rodriguesxxx/5-100-dias-estudando-estruturas-de-dados-pratica-para-criancas-lang-happy
Complementando o que o Maniero disse, é importante ressaltar alguns pontos.
Recursão não tem nada a ver com estruturas de dados. São duas coisas que podem ser usadas juntas, mas são dois assuntos diferentes. É importante dizer isso, porque da forma que está, o texto pode confundir (principalmente iniciantes).
E como já dito, embora seja importante entender o conceito, mais importante ainda é saber quando não usar recursão. E já adianto que para a maioria dos casos mais comuns do dia a dia (ainda mais em desenvolvimento web), vc não vai precisar implementar um algoritmo recursivo. Loops simples resolvem muito bem a esmagadora maioria dos problemas que vc vai encontrar.
Vale ressaltar que em muitas situações, a versão recursiva costuma ter desempenho pior - já falei sobre o assunto aqui, aqui e aqui.
No caso de percorrer uma matriz, é claramente pior. E ainda tem o problema de poder estourar a pilha se a matriz for muito grande, já que cada chamada recursiva vai sendo empilhada e fica lá até que todas tenham terminado (a menos que haja otimização da recursão em cauda). Esse problema não ocorre se usar um loop simples (e já está explicado em detalhes nos links que indiquei acima).
É interessante saber disso, mas também é bom entender que recursividade não é necessária na maioria dos casos e este especificiamente é mais eficiente fazer com um laço normal.
Ajudei? Era o meu desejo.
Farei algo que muitos pedem para aprender a programar corretamente, gratuitamente. Para saber quando, me segue nas suas plataformas preferidas. Quase não as uso, não terá infindas notificações (links aqui).