12 de abril de 2021

Do bit Ao Byte

Embarcados, Linux e programação

Desafio Maker 06: Solução – função recursiva em C++

solução | TaskHandle | PORTB | bitwise | bit field | função lambda | função recursiva em C++

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:

função recursiva em C++

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