Como citado no Desafio Maker 06, 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.
O que é uma função recursiva?
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.
Cuidado ao usar funções recursivas
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.
Código da função recursiva em C++
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
Artigos relacionados
Funções lambda no MicroPython
Debug do ESP32 no VS Code com ESP-Prog
Como depurar com o ESP-Prog