Rekursja w programowaniu to technika, w której funkcja wywołuje samą siebie, aby rozwiązać mniejszą wersję tego samego problemu, aż do osiągnięcia przypadku bazowego, który może być rozwiązany bezpośrednio. W języku C rekursja jest często wykorzystywana do rozwiązywania problemów, które można naturalnie podzielić na podproblemy o podobnej naturze, takich jak algorytmy sortowania, obliczanie silni, generowanie permutacji itp. Kluczem do skutecznego stosowania rekursji jest zapewnienie, że każde rekurencyjne wywołanie funkcji zbliża się do przypadku bazowego i że ten przypadek bazowy jest właściwie obsługiwany.
Przykład kodu w C: Obliczanie silni za pomocą funkcji rekurencyjnej
#include <stdio.h>
// Deklaracja funkcji rekurencyjnej do obliczania silni
unsigned long long factorial(unsigned int n) {
// Przypadek bazowy: silnia z 0 jest równa 1
if (n == 0) {
return 1;
} else {
// Krok rekurencyjny: n! = n * (n-1)!
return n * factorial(n - 1);
}
}
int main() {
unsigned int number;
printf("Podaj liczbę do obliczenia silni: ");
scanf("%u", &number);
// Wywołanie funkcji rekurencyjnej i wyświetlenie wyniku
printf("Silnia z %u wynosi: %llu\n", number, factorial(number));
return 0;
}
Komentarze do kodu
- Funkcja rekurencyjna
factorial
: Przyjmuje ona liczbę typuunsigned int
i zwraca jej silnię jakounsigned long long
, aby móc obsłużyć duże wartości. - Przypadek bazowy: Jest to warunek zatrzymania rekursji. Dla funkcji obliczającej silnię, przypadek bazowy to 0!, który jest równy 1.
- Krok rekurencyjny: Tutaj funkcja wywołuje samą siebie z argumentem o jeden mniejszym niż aktualny, zbliżając się do przypadku bazowego.
Podsumowanie
Rekursja jest potężnym narzędziem w języku C, umożliwiającym eleganckie i zwięzłe rozwiązania dla wielu problemów algorytmicznych. Kluczowe dla skutecznego stosowania rekursji jest zrozumienie jej mechanizmu, w tym definicji przypadku bazowego, który zapobiega nieskończonej rekursji, oraz kroku rekurencyjnego, który musi systematycznie zbliżać się do tego przypadku. Odpowiednie stosowanie rekursji może prowadzić do rozwiązań, które są nie tylko efektywne, ale także łatwe do zrozumienia i utrzymania.