Um procedimento ou função pode conter uma chamada para outro procedimento dentro dele. Inclusive, a sub-rotina pode chamar a si mesma. Nesse caso, o computador não se importa. Ele, como sempre, executa consistentemente os comandos que conhece de cima para baixo. 
 
Se você se lembra da matemática, então pode encontrar o princípio da indução matemática. É o seguinte: alguma afirmação é verdadeira para todo natural n se 
    1) é válido para n = 1; 
    2) da validade da afirmação para qualquer natural arbitrário n = k  segue-se que é verdade para n = k+1. 
 
Na programação, essa técnica é chamada de recursão. 
 
Recursão é uma forma de definir um conjunto de objetos em termos do próprio conjunto, com base em casos base simples fornecidos. 
 
Recursivo é um procedimento (função) que chama a si mesmo diretamente ou através de outros procedimentos e funções. 
Exemplo de procedimento recursivo:
void Rec(int a) 
{ 
  if (a>0) { Rec(a-1); } 
  Console.WriteLine(a); 
} 
 Esquematicamente, o trabalho de recursão pode ser representado como um fluxograma.
Rec() o procedimento é executado com parâmetro 3 Em seguida, dentro do procedimento com parâmetro 3, chama-se o procedimento com parâmetro 2, e assim sucessivamente, até chamar o procedimento com parâmetro 0. work. Em seguida, o controle é transferido de volta para o procedimento com o parâmetro 1, ele também termina seu trabalho imprimindo o número 1 e assim por diante. antes do procedimento com o parâmetro 3.  
 
Todos os procedimentos chamados são armazenados na memória até que concluam seu trabalho. O número de procedimentos simultâneos é chamado de profundidade de recursão.
  
            
            
                  
            
             
                    
            
                 
      
                  
           | 
	
		
 
     
              
              
                  
                       
            
                
          
            Descobrimos que a recursão é a execução repetida de comandos contidos em uma sub-rotina. E isso, por sua vez, é semelhante ao trabalho do ciclo. Existem linguagens de programação nas quais a construção do loop está ausente, por exemplo, Prolog.  
Vamos tentar simular o funcionamento do loop  para.  
O loop  for contém uma variável de contador de passos. Em uma sub-rotina recursiva, tal variável pode ser passada como um parâmetro.
// procedimento LoopImitation() com dois parâmetros
// primeiro parâmetro – contador de passos, segundo parâmetro – número total de passos
static void LoopImitation(int i, int n)
{
  Console.WriteLine("Olá N" + i); // declaração a ser repetida para qualquer valor i 
  if (i < n) // até que o contador de loop seja igual a n,
  {
    LoopImitation(i+1, n); // chamando um novo procedimento de instância, com o parâmetro i+1 (vá para o próximo valor i)
  }
}  
            
            
                  
            
             
                    
            
                 
      
                  
           | 
	
		
 
     
              
              
                  
                       
            
                
          
            Recursão e iteração
Para entender a recursão, você precisa entender a recursão...  
  
Iteração na programação -  uma etapade um processo cíclico de processamento de dados.  
Freqüentemente, algoritmos iterativos na etapa atual (iteração) usam o resultado da mesma operação ou ação calculada nas etapas anteriores.  Um exemplo desses cálculos é o cálculo das relações de recorrência.  
Um exemplo simples de valor recursivo é o fatorial:  \(N!=1 \cdot 2 \cdot 3 \cdot \ ... \ \cdot N\).  
O cálculo do valor em cada etapa (iteração) é  \(N=N \cdot i\) .  Ao calcular o valor de  \(N\), tomamos o valor já armazenado  \(N\).< br />
 
O fatorial de um número também pode ser descrito usando a  fórmula recorrente:
 \(\begin{equation*} n!= \begin{cases} 1 &\text{n <= 1,}\\ (n-1)! \cdot n &\text{n > 1.} \end{casos} \end{equação*}\)
Você pode perceber que esta descrição nada mais é do que uma função recursiva. 
Aqui, a primeira linha ( \(n <= 1\)) é o caso base (condição de término da recursão) e a segunda linha é a transição para a próxima etapa.  < br />
 
 
| Função fatorial recursiva | 
Algoritmo iterativo | 
 
static int Fatorial(int n){
se (n > 1)
return n * Fatorial(n - 1);
caso contrário, retorne 1;
}
 | 
int x = 1;
for (int i = 2; i <= n; i++)
  x = x * i;
Console.WriteLine("%d", x);
 | 
 
 
Deve ser entendido que as chamadas de função envolvem alguma sobrecarga adicional, portanto, um cálculo fatorial não recursivo será um pouco mais rápido.  
 
Conclusão: onde você pode escrever um programa com um algoritmo iterativo simples, sem recursão, então você precisa escrever sem recursão. Ainda assim, existe uma grande classe de problemas onde o processo computacional é implementado apenas por recursão. 
Por outro lado, algoritmos recursivos costumam ser mais compreensíveis.  
            
            
                  
            
             
                    
            
                 
      
                  
           | 
	
		
 
     
              
              
                  
                       
            
                
          
            Tradução recursiva de um número de um sistema numérico para outro
Em em algumas situações em procedures, você pode usar a palavra  return  sem um argumento - ou seja, de fato, a procedure ainda não retorna nada. Isso pode ser útil na recursão, quando  ; return  code> é usado para terminar a descida em casos base de valores de parâmetro sendo recursados. Por exemplo, um procedimento que converte um número de decimal para binário pode ser assim:
static void printTwo(int n)
{  
  se (n == 0) retornar;
  printTwo(n / 2);
  if (n % 2 == 0) Console.Write(0);
  else Console.Write(1);
} 
            
            
                  
            
             
                    
            
                 
      
                  
           | 
	
		
 
     
              
              
                  
                       
            
                
          
            Tarefa
No alfabeto da língua da tribo "Tumba-Yumba"; quatro letras: "K", "L", "M" e "N". Você precisa exibir todas as palavras que consistem em n letras que podem ser construídas a partir das letras deste alfabeto.
O problema é um problema normal de força bruta que pode ser reduzido a um problema menor. 
Substituiremos sequencialmente as letras da palavra. 
A primeira posição de uma palavra pode ser uma das 4 letras do alfabeto (K. L, M, N).
 Vamos colocar a letra K primeiro. Então, para obter todas as variantes com a primeira letra K, você precisa enumerar todas as combinações possíveis de letras nas posições n - 1 restantes e assim por diante. (veja a foto). 
 
  
Assim, o problema se reduz a resolver quatro problemas de comprimento  n - 1.
 
 Iterar sobre n caracteres recursivamente
w[0]='K'; // itera sobre os últimos caracteres L-1
w[0]='L'; // itera sobre os últimos caracteres L-1
w[0]='M'; // itera sobre os últimos caracteres L-1
w[0]='N'; // itera sobre os últimos caracteres L-1
w - uma cadeia de caracteres que armazena a palavra de trabalho. 
Assim, temos recursão. Podemos organizar a solução do problema na forma de um procedimento recursivo.  
Resta determinar quando a recursão terminará? Quando todos os caracteres são definidos, ou seja, o número de caracteres definidos é n. Nesse caso, você precisa exibir a palavra resultante na tela e sair do procedimento. 
 
O programa C# ficará assim. 
// w - parâmetro alterável (string-result)
// O procedimento TumbaWords recebe o alfabeto como uma string de caracteres,
// a palavra word e o número de caracteres já definidos (no início – 0)
static void TumbaWords( string A, ref string w, int N )
{
    if (N == w.Length) // w.Length - o número de caracteres na string
    {
  // se todos os caracteres já tiverem sido definidos para a palavra,    
  // então é necessário enviar uma string e terminar o procedimento
       Console.WriteLine(w);
       retornar;
    }
    for ( int i = 0; i < w.Length; i ++ ) // se a condição acima for falsa (ou seja, nem todos os caracteres são espaçados,
    {
    // se a condição acima for falsa (isto é, nem todos os caracteres são espaçados,  
  // então no loop passamos por todos os caracteres do alfabeto e
  // coloca alternadamente o caractere no primeiro espaço livre
        w += A[i];
        TumbaPalavras(A, ref w, N+1);
        w = w.Remove(w.Length - 1); // e, em seguida, remova o último caractere adicionado,
  // para criar uma nova palavra com o mesmo prefixo
    }
}
static void Main()
{
    int n = Convert.ToInt32(Console.ReadLine());
    string palavra = "";
    TumbaWords("KLMN", ref word, 0);
}
 
OBSERVE que w é um parâmetro mutável (string de resultado)! 
            
            
                  
            
             
                    
            
                 
      
                  
           |