Published
Last modified
Recursividade Em Funções em C/C++
E se pudéssemos chamar a função que ainda estamos fazendo dentro dela mesma. Isso seria loucura, certo? Mas sim, é possível, se usarmos recursividade.
O que é recursividade? Bem, recursividade não é um comando, mas uma "habilidade" de uma função chamar a si mesma. Isto não é privilégio apenas da linguagem C, muitas outras linguagens como Java, Visual Basic, entre outras também é possível ser feito isso.
Mas é importante entender este conceito, pois ele é muito útil e pode ajudar a deixar seu algoritmo muito mais simples.
Como fazemos uma função chamar ela mesma?
É simples, basta escrever no código da função, a função que está sendo criada como se ela já tivesse sido criada antes. Parece estranho isso, mas vamos imaginar um exemplo simples: Temos um programa - sabemos que o código do programa está todo dentro da função MAIN - se quisermos reiniciar o programa basta chamarmos a função MAIN novamente.
Seria como
#include <iostream> #include <cstdlib> using namespace std; int main (void){ int a, b, c, opcao; cout <<"Digite o valor de A: "; cin >> a; cin.ignore(); cout <<"Digite o valor de B: "; cin >> b; cin.ignore(); c=a+b; cout <<"O resultado de A + B e "<<c<<"\n\n \Deseja reiniciar o programa e realizar outro calculo?\n \1. Sim\t2.Nao\n\n=> "; cin >> opcao; if (opcao==1) /* se '1' for digitado, a função MAIN chama a função MAIN, ou seja, reinicia o programa.*/ main(); else return EXIT_SUCCESS; }
* iniciou o programa
-> Chama automaticamente a função MAIN
* processos e comandos dentro do código
-> Contas com variáveis, condições, atribuições, etc...
* chama-se a função MAIN
-> Sem fechar o programa, ele chama ele mesmo de novo (reinicia)
Basicamente o processo é esse.
Muito provavelmente deve estar imaginando: No que isso pode ser usado? Bem, existem casos onde é necessário realizar um processo ou uma conta com um resultado anterior da sequência. Em Universidades, faculdades e cursos de programação um algoritmo muito pedido é a famosa sequência de Fibonacci. Essa sequência consiste em o 1o e o 2o termos são 1, e os termos seguintes são a soma dos dois termos anteriores. Ou seja, o 3o termo é a soma de 1+1 que é 2; o 4o termo é a soma de 1+2 que é 3; o 5o termo é a soma de 2+3 que é 5...
Isso resulta em : 1 - 1 - 2 - 3 - 5 - 8 - 13 - 21 - 34 - 55 - 89 ...
Para fazer a conta acima usaremos uma função que chamaremos de fibonacci que recebe como argumento exatamente qual termos queremos calcular.
#include <iostream> #include <cstdlib> using namespace std; double fibonacci (int t); int main (void){ int termo; double fibo; cout <<"Digite o termo de fibonacci que deseja saber: "; cin >> termo; cin.ignore (); if (termo==0){ cout<<"Nao existe termo 0!\n\n"; main(); } cout <<"\nAguarde! Processando...\n\n"; fibo=fibonacci (termo-1); cout <<"O "<<termo<<"o. termo da sequencia de Fibonacci e "<<fibo<<"\n\n"; system ("pause"); return EXIT_SUCCESS; } double fibonacci (int t){ if (t==0 || t==1) return 1; else return fibonacci (t-1)+fibonacci (t-2); }
Como podemos ver, esse algoritmo é bem simples. Ele tem uma entrada de dado que é o termo que queremos achar. Esse termo é passado como parâmetro para a função fibonacci. Quem faz toda a conta é a função.
Mas toda facilidade tem seu custo. Apesar de nosso algoritmo estar curto, toda vez que chamamos uma função leva um certo tempo para ser processada. No exemplo acima podemos perceber isso bem, pois, dependendo do termo que digitamos, levará um tempo maior para ser processado o resultado. Isso acontece porque a partir do termo 3 a mesma função é chamada três vezes e isso aumenta exponencialmente. Se passarmos o termo 45, por exemplo, a mesma função será chamada algumas centenas de vezes. Dependendo da configuração do computador que está executando, isso pode levar pelo menos 3 minutos até que se chegue a um resultado.
Então, a recursividade deve ser usada com cautela. Às vezes, um algoritmo um pouco mais complexo que usa um pouco mais de variáveis pode ser necessário para que se tenha um desempenho melhor.
Recursividade Em Funções em C/C++ by Denys Xavier is licensed under a Creative Commons Attribution 4.0 International License.