Professional Documents
Culture Documents
Metodą rekurencyjną nazywamy taką metodę, w której stosujemy rekurencję (zwaną także
rekursją). Być może takie sformułowanie wydaje ci się pozbawione sensu. Tymczasem jest ono
charakterystyczne właśnie dla rekurencji, która oznacza odwoływanie się funkcji (lub definicji) do
samej siebie.
W matematyce funkcją rekurencyjną nazywamy funkcję, która jest zdefiniowana za pomocą samej
siebie. W informatyce zaś funkcją rekurencyjną jest funkcja, która wywołuje samą siebie.
W powyższych definicjach nie wspomnieliśmy jeszcze o najważniejszym elemencie, mianowicie nie
ma w nich określenia warunku zakończenia odwołań rekurencyjnych. Prześledźmy na przykładzie
zastosowanie funkcji rekurencyjnej.
Przykład:
Napiszmy funkcję iteracyjną, która obliczy silnię dowolnej liczby naturalnej.
return silnia;
}
Powyższa funkcja pobierze naturalną liczbę n, a wynikiem jej działania będzie iloczyn kolejnych
liczb naturalnych (obliczenia wykonają się w pętli for) aż do n włącznie. Jeśli chcemy policzyć silnię
0, program nie wykona pętli, a funkcja przyjmie wartość 1. Ponieważ silnia jest funkcją osiągającą
bardzo duże wartości dla małych n, wybraliśmy dla nich typ double.
Spróbujmy teraz ten sam problem zdefiniować rekurencyjnie. Zacznijmy od tego, że przy znanej
wartość silni liczby 4 łatwo obliczysz silnię dla 5, ponieważ skoro 4! = 24, to 5! = 24 • 5, co daje
120. W ogólnej postaci możemy więc zapisać: n! = (n - 1)! • n
Zwróćmy uwagę na odwołanie rekurencyjne - silnia liczby n jest równa wartości silni liczby (n - 1)
pomnożonej przez liczbę n. Oczywiście, aby zgodnie z naszą definicją rekurencyjną policzyć silnię
dla (n - 1), należy obliczyć silnię (n - 2) i pomnożyć ją przez (n - 1) itd. W celu zakończenia tych
czynności musimy postawić warunek zakończenia odwołań rekurencyjnych.
Aby funkcja rekurencyjną była poprawna, musi mieć ściśle zdefiniowany warunek zakończenia
odwołań rekurencyjnych.
W przypadku funkcji silnia takim warunkiem jest definicja silni dla n = 0, czyli 0! = 1. Pełna definicja
rekurencyjną funkcji silnia ma zatem postać:
!=1 =0
! = ( − 1)! ∗
Pozostaje nam tylko zapisać za pomocą języka programowania definicję matematyczną w postaci
funkcji rekurencyjnej:
double silnia(int n)
{
if (n==0) // warunek początkowy rekurencji (1)
return 1;
else
return silnia(n—1)*n; // rekurencyjne wywołanie funkcji (2)
}
W linii 2 jest zawarte wywołanie rekurencyjne funkcji silnia. We wnętrzu funkcji wywołujemy
funkcję, którą właśnie piszemy. Taki zapis powoduje, że program po dotarciu do linii numer
2 kodu nie jest w stanie dokończyć instrukcji, musi bowiem wywołać funkcję silnia z parametrem
n o 1 mniejszym. Każde wywołanie funkcji jest związane z zapamiętaniem kopii wszystkich
zmiennych funkcji oraz z umieszczeniem na stosie adresu powrotnego, czyli miejsca w programie,
do którego system ma powrócić po zakończeniu funkcji.