Já sabemos que é legal um método invocar o outro método, e vimos vários exemplos destes. Mas também é legal um método invocar ele mesmo. Pode não ser óbvio o por que é isto é necessário, mas acaba por ser uma das coisas mais interessantes que um programa pode fazer e este tipo de técnica é chamada de recursão.
Recursão é o processo de repetir itens de uma forma auto similar. Por exemplo, quando as superfícies dos dois espelhos são exatamente paralela uma com a outra as imagens que ocorrem aninhadas são uma forma de recursividade infinita. O termo tem uma variedade de significados específicos para uma variedade de disciplinas que vão desde a lógica linguística. A aplicação mais comum da recursividade é em matemática e ciência da computação, no que se refere a um método de definição de funções em que a função a ser definida é aplicada dentro de sua própria definição.
Mas é preciso planejar bem as recursões pois se houver erros em sua lógica, assim como os laços as recursões também podem ser infinitas.
Exemplo:
Neste exemplo vamos programar uma contagem regressiva utilizando um método recursivo.
Java
public class Recursiva { static void contagemRegressiva (int n ) { if ( n == 0 ) { System.out.println("Explosão!!!"); } else { System.out.println(n); contagemRegressiva (n-1); } } public static void main(String[] args) { int contagem = 10; System.out.println("Iniciando contage regressiva"); contagemRegressiva(contagem); } }
C++
#include "stdafx.h" #include <iostream> using namespace std; static void contagemRegressiva(int n) { if (n == 0) { cout << "Explosão!!!" << endl; } else { cout << n << endl; contagemRegressiva(n - 1); } } int _tmain(int argc, _TCHAR* argv[]) { int contagem = 10; cout << "Iniciando contagem regressiva." << endl; contagemRegressiva(contagem); system("pause"); return 0; }
C#
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DesenvolvimentoAberto { class Program { static void contagemRegressiva (int n ) { if ( n == 0 ) { Console.WriteLine("Explosão!!!"); } else { Console.WriteLine(n); contagemRegressiva (n-1); } } static void Main(string[] args) { int contagem = 10; Console.WriteLine("Iniciando contagem regressiva"); contagemRegressiva(contagem); Console.ReadKey(); } } }
Python
#!/usr/bin/env python # -*- coding: latin-1 -*- # Desenvolvimento Aberto # recursivo.py # Importa OS import os # Limpa a tela os.system("clear") def ContagemRegressiva (n): if (n==0): print"Explosão!!!" else: print n ContagemRegressiva(n-1) contagem = 10 print "Inciando contagem regressiva" ContagemRegressiva (contagem) raw_input()
Abap
*&---------------------------------------------------------------------* *& Report ZRECURSIVO *& *&---------------------------------------------------------------------* *& Desenvolvimento Aberto *& Metodos Recursivos *&---------------------------------------------------------------------* REPORT ZRECURSIVO. PARAMETERS :CONTAGEM TYPE i. WRITE : / 'Iniciando contage regressiva.'. PERFORM CONTAGEM_REGRESSIVA USING CONTAGEM. FORM CONTAGEM_REGRESSIVA USING N TYPE i. IF ( N EQ 0 ). WRITE : / 'Explosão!!!'. ELSE. WRITE : / N. N = N - 1. PERFORM CONTAGEM_REGRESSIVA USING N. ENDIF. ENDFORM.