Odwołanie funkcji do samej siebie to
A. rekurencja.
B. hermetyzacja.
C. iteracja.
D. dziedziczenie.
Pytanie z egzaminu CKE, styczeń 2015 (arkusz E.14-X-15.01).
Odwołanie funkcji do samej siebie nazywa się rekurencją. Chodzi o sytuację, w której funkcja w swoim ciele wywołuje samą siebie, najczęściej z innym, zwykle mniejszym albo prostszym zestawem danych. Kluczowa jest tu baza rekurencji, czyli warunek zatrzymania. Bez niej program będzie wywoływał funkcję w kółko, aż do przepełnienia stosu wywołań, co w praktyce kończy się błędem typu stack overflow albo zawieszeniem działania. Z mojego doświadczenia to jest właśnie najczęstsza pułapka przy nauce rekurencji: ktoś pamięta o wywołaniu funkcji, ale zapomina kiedy ma się ono skończyć. Rekurencja jest używana np. przy obliczaniu silni, przechodzeniu po drzewach katalogów, analizie struktury DOM w JavaScript, przeszukiwaniu grafów czy parsowaniu zagnieżdżonych danych JSON. W dobrych praktykach programistycznych warto sprawdzać, czy rekurencja jest czytelniejsza niż pętla i czy nie grozi zbyt dużą liczbą wywołań. Czasem iteracja będzie wydajniejsza, ale przy strukturach drzewiastych rekurencja bywa po prostu bardzo naturalna i elegancka.
W tym pytaniu chodzi o podstawowe pojęcie z algorytmiki i programowania: jeżeli funkcja wywołuje samą siebie, mówimy o rekurencji. Łatwo to pomylić z innymi terminami, bo wszystkie występują w programowaniu, ale opisują zupełnie inne mechanizmy. Dziedziczenie dotyczy programowania obiektowego. Oznacza tworzenie klasy na podstawie innej klasy, tak aby przejąć jej pola i metody, a potem ewentualnie je rozszerzyć albo nadpisać. Nie ma tu warunku, że funkcja ma wołać samą siebie, więc to zupełnie inny temat. Hermetyzacja też należy do programowania obiektowego i polega na ukrywaniu szczegółów działania obiektu oraz kontrolowaniu dostępu do danych, na przykład przez modyfikatory private, protected i public. To dobra praktyka projektowa, ale nie opisuje sposobu wykonywania algorytmu. Iteracja oznacza powtarzanie instrukcji w pętli, na przykład for, while albo foreach. Może rozwiązywać podobne problemy co rekurencja, jak liczenie silni czy przetwarzanie listy, ale technicznie działa inaczej: zamiast kolejnych wywołań funkcji mamy powtarzanie bloku kodu. Typowy błąd myślowy polega na tym, że ktoś widzi powtarzanie czynności i od razu wybiera iterację. Rekurencja też powtarza działanie, ale przez mechanizm wywołań funkcji i koniecznie potrzebuje warunku stopu. Moim zdaniem warto zapamiętać prosto: funkcja wywołuje samą siebie, czyli rekurencja; pętla powtarza blok kodu, czyli iteracja.