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).