Exercícios Resolvidos de Recursão

Ver Teoria

Enunciado

Escreva uma função recursiva que receba um número inteiro positivo como parâmetro e o imprima verticalmente, ou seja, um dígito por linha.

Exemplo:

Se o número recebido for 198 a função irá exibir

1

9

8

Passo 1

Mermão, essa braba! Aqui a gente precisa se ligar em outra propriedade das funções pra gente entender bem o que tá acontecendo.

Mas se liga, vou te falar o segredo da parada. Tu já reparou que, quando uma função termina, a linha execução volta pra onde a gente chamou a função? Assim, olha:

Se a gente executar esse programa, o resultado vai ser esse:

Viu? Esse exemplo foi só pra enfatizar que, quando a função termina, o programa volta pra linha de onde a função foi chamada e continua o fluxo. Isso também acontece se você chamar uma função dentro de outra e, o ponto onde eu quero chegar é, também acontece nas chamadas recursivas! Olha essa função:

Se parâmetro recebido for diferente de 0, então vai retornar n * fatorial(n-1). Caso contrário (caso seja igual a 0), vai retornar 1. Essa função calcula n fatorial. Mas, vou adicionar uns print() pra te mostrar uma parada dahora!

Olha! Eu coloquei alguns prints e chamei a função depois pra calcular 5 fatorial. Olha o resultado desse programa depois de executado:

Olha isso! Sacou que as funções recursivas vão empilhando problemas cada vez menores até conseguir solucionar, e depois vai voltando até chegar no problema maior de novo?!

E você já vai sacar o porque eu to te dizendo isso, mas antes, bora voltar pro nosso enunciado e pensar na estrutura que a função do nosso exercício vai ter.

Passo 2

Se liga, se a nossa função vai exibir verticalmente um número, o que a gente precisa pra fazer a função funcionar?? Bom, precisamos do número a ser exibido, certo? Então esse vai ser nosso único parâmetro!

Beleza! Agora, a gente precisa verificar nosso caso base. Bom, o pensamento recursivo é o seguinte: exibe o último e depois exibe verticalmente o resto! Mas, caso o número seja 0, não precisamos fazer nada.

Ou seja, se n for diferente de 0, exibe o último dígito (n%10) e depois exibe verticalmente o resto dos dígitos (n//10).

Obs: caso você não lembre bem, a gente tá separando o último dígito do número. Olha o exemplo:

Viu?! Com as operações //10 e %10, a gente consegue separar o último dígito de um número inteiro. Beleza! Mas se a gente executar esse código e testar o número 198, não vai ficar igual ao enunciado!

O resultado foi:

Ala! Ficou ao contrário! Precisamos rever isso!

Passo 3

Calma, relaxou, o que acontece é que a gente tá exibindo o último dígito pra depois exibir o resto verticalmente, mas a gente também pode fazer na ordem contrária (por isso falei sobre a linha de execução no primeiro passo).

Se a gente fizer a chamada recursiva antes de exibir o último dígito, então todos os dígitos vão ser exibidos na ordem contrária! Lembra que falamos agora pouco que as funções recursivas vão e voltam?! Olha o que acontece quando a gente executa esse programa agora:

Agora ficou exatamente como no enunciado! A ideia é que dá pra mudar a ordem que as funções recursivas vão executar seus comandos, se é de trás pra frente ou de frente pra trás, só de colocar o comando antes ou depois da chamada recursiva. Nesse caso, colocar o print(n//10) antes da chamada recursiva exibe_vert(n//10) devolve o resultado na ordem contrária de chamar depois, sacou?!

Passo 4

Agora nosso programa já funciona. Mas eu queria te lembrar que “if (n!=0):” é a mesma coisa que “if n:”.

Essa função faz exatamente a mesma coisa que a função que a gente já tinha feito, mas assim fica mais limpa bonitinha!

Essa matéria é bem confusa, né?! Mas calma, continua aqui nos exercícios que a gente vai ficar craque em recursão! Te espero no próximo exercício, hein!

Resposta