Dela via


Rekursiva procedurer (Visual Basic)

En rekursiv procedur är en som anropar sig själv. I allmänhet är detta inte det mest effektiva sättet att skriva Visual Basic-kod.

I följande procedur används rekursion för att beräkna factorialen för det ursprungliga argumentet.

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

Överväganden med rekursiva procedurer

Begränsningsvillkor. Du måste utforma en rekursiv procedur för att testa för minst ett villkor som kan avsluta rekursionen, och du måste också hantera det fall där inget sådant villkor uppfylls inom ett rimligt antal rekursiva anrop. Utan minst ett villkor som kan uppfyllas utan fel, löper proceduren en hög risk att köras i en oändlig loop.

Minnesanvändning. Programmet har en begränsad mängd utrymme för lokala variabler. Varje gång en procedur anropar sig själv använder den mer av det utrymmet för ytterligare kopior av sina lokala variabler. Om den här processen fortsätter på obestämd tid orsakar den till slut ett StackOverflowException fel.

Effektivitet. Du kan nästan alltid använda en loop i stället för rekursion. En loop har inte den extra kostnaden för att skicka argument, initiera ytterligare lagring och returnera värden. Prestandan kan vara mycket bättre utan rekursiva anrop.

Ömsesidig rekursion. Du kan se mycket dåliga prestanda, eller till och med en oändlig loop, om två procedurer anropar varandra. En sådan design uppvisar samma problem som en enda rekursiv procedur, men kan vara svårare att identifiera och felsöka.

Anropa med parenteser. När en Function procedur anropar sig själv rekursivt måste du följa procedurnamnet med parenteser, även om det inte finns någon argumentlista. Annars används funktionsnamnet som representerar funktionens returvärde.

Testning. Om du skriver en rekursiv procedur bör du testa den mycket noggrant för att se till att den alltid uppfyller vissa begränsande villkor. Du bör också se till att minnet inte tar slut på grund av för många rekursiva anrop.

Se även