Compartilhar via


Procedimentos recursivos (Visual Basic)

Um procedimento recursivo é aquele que chama a si mesmo. Em geral, essa não é a maneira mais eficaz de escrever código em Visual Basic.

O procedimento a seguir usa a recursão para calcular o fatorial de seu argumento original.

Function Factorial(n As Integer) As Integer
    If n <= 1 Then
        Return 1
    End If
    Return Factorial(n - 1) * n
End Function

Considerações sobre procedimentos recursivos

Limitar condições. Você deve criar um procedimento recursivo para testar pelo menos uma condição que possa encerrar a recursão e também deve lidar com o caso em que nenhuma condição desse tipo é atendida em um número razoável de chamadas recursivas. Sem pelo menos uma condição que possa ser atendida sem falha, seu procedimento corre um alto risco de permanecer em execução em um loop infinito.

Uso de Memória. Seu aplicativo tem uma quantidade limitada de espaço para variáveis locais. Cada vez que um procedimento se chama, ele usa mais desse espaço para cópias adicionais de suas variáveis locais. Se esse processo continuar indefinidamente, isso eventualmente causará um erro StackOverflowException.

Eficiência. Você quase sempre pode usar um loop em vez de recursão. Um loop não tem a sobrecarga de passar argumentos, inicializar armazenamento adicional e retornar valores. Seu desempenho pode ser muito melhor sem chamadas recursivas.

Recursão mútua. Você poderá observar um desempenho muito ruim ou até mesmo um loop infinito, se dois procedimentos se chamarem. Esse design apresenta os mesmos problemas que um único procedimento recursivo, mas pode ser mais difícil de detectar e depurar.

Chamar com parênteses. Quando um procedimento Function se chama recursivamente, você deve colocar parênteses na sequência do nome do procedimento, mesmo que não haja uma lista de argumentos. Caso contrário, o nome da função será tomado como representando o valor retornado da função.

Testes. Se você escrever um procedimento recursivo, deve testá-lo com muito cuidado para garantir que ele sempre atenda a alguma condição de limitação. Você também deve garantir que não pode ficar sem memória devido a ter muitas chamadas recursivas.

Confira também