Co to jest wywołanie rekurencyjne?

W programowaniu wywołanie rekurencyjne jest poleceniem w podprogramie lub funkcji, które nakazuje programowi ponowne uruchomienie tego samego podprogramu. Powtarzanie wykonania może być bezpośrednim wynikiem działania funkcji lub może zostać uruchomiona druga funkcja, która z kolei odwołuje się do pierwszej funkcji. Wywołanie rekurencyjne ma pewne podobieństwa do przerażającej pętli nieskończonej, ale podprogram zawsze ma instrukcję warunkową, która mówi programowi, kiedy przestać powtarzać rekurencję.

Koncepcję rekurencji najlepiej chyba zilustrować na przykładzie. Załóżmy, że dekarz kładzie nowy gonty w domu. Na początek musi wnieść na dach wiązkę gontów. Kiedy już przybije pierwszy pakiet, musi zejść po drabinie, odzyskać kolejny pakiet i przybić go na miejscu. Proces jest kontynuowany jako seria „idź, przynieś, wróć”, aż do nałożenia ostatniego gontu. W tym momencie dekarz może przejść do następnej pracy lub wrócić do domu.

Chociaż przykład jest nadmiernym uproszczeniem, zawiera wszystkie elementy wywołania rekurencyjnego. Jest punkt wyjścia, dekarz musi odzyskać to, czego potrzebuje, wrócić do początku i po spełnieniu ostatecznego warunku zatrzymać się. To jest w zasadzie to, co robi program; rozpoczyna się, realizuje akcję, powraca do siebie i kończy się, gdy wystąpi warunek końcowy.

Warunek końcowy nazywany jest przypadkiem podstawowym. Jest niezbędny dla wszystkich wywołań rekurencyjnych; bez niego funkcja będzie się powtarzać. W najlepszym przypadku prowadzi to do wyczerpania zasobów pamięci systemu. Zwykle przeciążenie powoduje w pewnym momencie awarię programu, ale zanim problem zostanie wykryty, mogą zostać wyrządzone znaczne szkody.

Doświadczeni programiści mogą rozpoznać podobieństwo między wywołaniem rekurencyjnym a pętlą „for” lub „while”. Jeśli na przykład celem jest znalezienie całkowitej liczby zapasów wszystkich zapasów o numerach części większych niż 999, pętla „for” nakazuje programowi zlokalizowanie wszystkich kwalifikujących się wystąpień, a pętla „while” nakazuje programowi wykonanie pętli tylko wtedy, gdy podany warunek jest ważny. Można powiedzieć, że wywołanie rekurencyjne łączy niektóre cechy tych pętli z instrukcją „jeśli-to-inaczej”; jeśli ten warunek jest prawdziwy, zrób to lub zrób coś innego, jeśli warunek jest fałszywy. Rekurencja zazwyczaj pozwala jednak na bardziej zwarty kod i umożliwia przekazanie problemu do funkcji znajdującej się bliżej punktu, w którym jest on potrzebny.