Manual
do
Maker
.
com
Como citado no [Desafio Maker 06](https://www.manualdomaker.com/article/desafio-maker-06-incrementar-um-valor-ate-n/(abrir em uma nova aba)), a solução poderia ser em C ou C++, mas de C++ tem mesmo só o namespace e a biblioteca - isso porque fiz no laptop. E a solução é simples: função recursiva em C++. Se não lembrou ou não conhecia, aproveite os próximos parágrafos que precedem a solução.
Uma função recursiva pode ser feita em qualquer linguagem, até shell script. O que ela faz é chamar a si mesma até que uma determinada condição ocorra.
Depende muito do que se vai fazer, a função recursiva pode economizar umas linhas de código e trazer um toque especial ao programa, mas particularmente não vejo como um recurso que possa ser utilizado o tempo inteiro - até porque funções recursivas precisam ser bem planejadas. Não é o caso desse desafio, que propõe um mero incremento, mas se utilizada com uma estrutura complexa, pode vir a ser um problema de diversas maneiras.
Se executamos uma função, ela permanecerá em execução até que finalize. O que acontece se chamarmos uma função recursiva sem retorno? Bem, como podemos ver na imagem abaixo, é uma catástrofe.
Fiz esse exemplo no QtCreator porque estou acostumado a depurar código nele, mas é uma função recursiva em C++, não estou usando nada do Qt:
Repare na janela de encaixe do rodapé que a função foi se chamando recursivamente sem finalizar, uma após a outra, gerando uma cascata. Não é problema para um função vazia que só faz um incremento em um inteiro, mas imagine uma série de processamentos e variáveis sendo manipuladas durante cada execução recursiva. Podemos exaurir os recursos do dispositivo, principalmente sendo uma MCU. Existem outras implicações conforme o código que estive dentro da função, mas não vou me estender, só queria deixar claro que do jeito que está escrito esse exemplo é divertido, mas não recomendado para coisas em que se pretenda evitar problemas.
O código para testar no laptop ou no Raspberry é esse:
#include <iostream>
using namespace std;
int acum = 0;
void increase(int &value){
if (value < 10){
cout << "mais um..." << endl;
value += 1;
increase(value);
}
}
int main(){
increase(acum);
cout << acum << endl;
return 0;
}
Se fosse feito em um sketch para Arduino eu não conseguiria mostrar a recursividade, mas agora que está pronto é só colocar essa função antes de setup() e em setup() colocar as duas linhas que precedem o return, substituindo cout por Serial.println(acum).
Se gostou do QtCreator, saiba que com ele podemos programar em C++ sem usar o framework, vale a pena conhecer. O QtCreator faz parte do pacote Qt, ou se estiver usando Linux, tem a opção de instalá-lo pelas ferramentas de gerenciamento de pacotes de sua distribuição.
E ai, resolveu fácil? Fez uma função recursiva melhor? Comente lá no facebook!
Autor: Djames Suhanko
Revisão: Ricardo Amaral de Andrade
Inscreva-se no nosso canal Manual do Maker no YouTube.
Também estamos no Instagram.
Autor do blog "Do bit Ao Byte / Manual do Maker".
Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.