Compartilhar via


Procedimentos recursivos (Visual Basic)

Um procedimento recursivo é aquele que se chama a si mesmo. Em geral, essa não é a maneira mais eficaz de escrever código do 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

Condições Limitantes. 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, há um alto risco de o procedimento ser executado 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 chama a si mesmo, ele utiliza mais desse espaço para criar cópias adicionais de suas variáveis locais. Se esse processo continuar indefinidamente, ele eventualmente causará um StackOverflowException erro.

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 chamarem um ao outro. Esse design apresenta os mesmos problemas de um único procedimento recursivo, mas pode ser mais difícil de detectar e depurar.

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

Testes. Se você escrever um procedimento recursivo, deverá 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.

Consulte também