Funkcja f(n) = n*f(n-1) dla n>1 i f(n) = 1 w przeciwnym wypadku jest klasycznym przykładem rekurencji. W informatyce, rekurencja oznacza, że dana funkcja wywołuje samą siebie, aż do uzyskania tzw. warunku bazowego (czyli sytuacji, kiedy przestaje się wywoływać rekurencyjnie). Dokładnie tak jest w tym przypadku – dla n równego 1 lub niższego, funkcja zwraca 1 i nie wywołuje się dalej, a dla n większego od 1, każdorazowo wywołuje się z argumentem mniejszym o 1. Typowym przykładem tego typu funkcji jest silnia, czyli operacja matematyczna wykorzystywana m.in. w kombinatoryce, kryptografii czy analizie algorytmów. Takie podejście, choć bardzo eleganckie i naturalne w wielu zastosowaniach matematycznych, w praktyce programistycznej wymaga ostrożności – nieumiejętne stosowanie rekurencji może prowadzić do przepełnienia stosu (stack overflow). Optymalnie, przy dużych danych warto sięgnąć po podejście iteracyjne lub tzw. rekurencję ogonową, która bywa lepiej wspierana przez niektóre kompilatory. Moim zdaniem, umiejętność rozpoznania i zrozumienia rekurencji jest jedną z kluczowych kompetencji każdego programisty – czy to w Pythonie, Javie, czy C++. Warto też zauważyć, że rekurencja, chociaż czasem wydaje się mniej wydajna, pozwala bardzo klarownie zapisać nawet złożone problemy, na przykład przy przeszukiwaniu struktur drzewiastych czy rozwiązywaniu łamigłówek typu wieże Hanoi.
Pytanie dotyczyło funkcji, która w swojej definicji odwołuje się do samej siebie, czyli klasycznej rekurencji. Często można się pomylić, myląc rekurencję z iteracją, bo obie pozwalają na wielokrotne wykonanie pewnych działań. Jednakże w iteracji (np. za pomocą pętli for czy while) nie ma odwołania się funkcji do siebie samej, tylko powtarzany jest blok kodu według określonych warunków. Rekurencja natomiast polega na tym, że funkcja wywołuje samą siebie z różnymi parametrami, aż do osiągnięcia warunku końcowego, zwanego bazowym. Funkcja przedstawiona w pytaniu przypomina obliczanie silni, a nie potęgi liczby n – bo w potęgowaniu bazujemy na innym mechanizmie matematycznym, gdzie n-tej potęgi liczby n nie da się uzyskać przez kolejne mnożenie przez malejące liczby (tylko przez n-krotne mnożenie liczby n przez samą siebie). Częsty błąd to także utożsamianie tej struktury z ciągiem Fibonacciego, gdzie zależności są inne: każdy wyraz to suma dwóch poprzednich, a nie iloczyn bieżącej wartości i wyniku rekurencji. Takie pomyłki wynikają z powierzchownego spojrzenia na rekurencyjne definicje – kluczem jest zrozumienie, jak wyglądają zależności w matematyce i programowaniu. W praktyce, dobrze jest prześledzić, co dokładnie robi funkcja dla kilku kolejnych wartości – wtedy łatwiej zauważyć, czy to silnia, potęgowanie, czy właśnie rekurencyjna definicja innego typu. Moim zdaniem, najlepszą praktyką jest nie tylko patrzenie na wzór, ale też rozpisywanie poszczególnych wywołań, żeby zobaczyć, dokąd prowadzi dana zależność.