Udostępnij za pośrednictwem


Procedury rekurencyjne (Visual Basic)

Procedura rekursywna jest taka, która wywołuje samą siebie. Ogólnie rzecz biorąc, nie jest to najbardziej efektywny sposób pisania kodu języka Visual Basic.

Poniższa procedura używa rekursji, aby obliczyć współczynnik oryginalnego argumentu.

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

Zagadnienia dotyczące procedur cyklicznych

Ograniczenia warunków. Należy zaprojektować procedurę rekursywną, aby przetestować co najmniej jeden warunek, który może zakończyć rekursję, i należy również obsłużyć przypadek, w którym taki warunek nie jest spełniony w rozsądnej liczbie wywołań cyklicznych. Bez co najmniej jednego warunku, który można spełnić bez awarii, procedura uruchamia wysokie ryzyko wykonania w nieskończonej pętli.

Użycie pamięci. Aplikacja ma ograniczoną ilość miejsca dla zmiennych lokalnych. Za każdym razem, gdy procedura wywołuje się, używa więcej miejsca na dodatkowe kopie zmiennych lokalnych. Jeśli ten proces będzie kontynuowany w nieskończoność, w końcu powoduje błąd StackOverflowException .

Efektywność. Prawie zawsze można użyć pętli zamiast rekursji. Pętla nie ma obciążenia związanego z przekazywaniem argumentów, inicjowaniem dodatkowego magazynu i zwracaniem wartości. Wydajność może być znacznie lepsza bez wywołań cyklicznych.

Wzajemne rekursji. Możesz zaobserwować bardzo niską wydajność, a nawet nieskończoną pętlę, jeśli dwie procedury siebie wywołają. Taki projekt przedstawia te same problemy co pojedyncza procedura rekursywna, ale może być trudniejsza do wykrywania i debugowania.

Wywoływanie za pomocą nawiasów. Function Gdy procedura wywołuje się rekursywnie, należy postępować zgodnie z nazwą procedury nawiasami, nawet jeśli nie ma listy argumentów. W przeciwnym razie nazwa funkcji jest traktowana jako reprezentująca zwracaną wartość funkcji.

Testowanie. Jeśli napiszesz procedurę rekursywną, należy ją dokładnie przetestować, aby upewnić się, że zawsze spełnia jakiś warunek ograniczający. Należy również upewnić się, że nie można zabrakło pamięci ze względu na zbyt wiele wywołań cyklicznych.

Zobacz też