Przeczytaj
Wyniki działania dwóch różnych funkcji rozwiązujących ten sam problem są takie same – niezależnie od tego, czy zastosujemy mechanizm rekurencyjnyrekurencyjny, czy iteracyjnyiteracyjny. Odmienny jest natomiast sposób zapisu kodów funkcji oraz sposób ich działania. Przekonamy się o tym na przykładzie dwóch funkcji obliczających wartość silni.
Silnia liczby n jest iloczynem wszystkich liczb naturalnych od 1 do n. Wyjątkiem jest silnia liczby 0, która wynosi 1.
Wzór rekurencyjny na obliczanie ma postać:
A oto wzór iteracyjny:
Korzystając z przedstawionych wzorów możemy zdefiniować dwie wersje funkcji obliczające wartość silni:
wykorzystującą mechanizm rekurencji;
działającą z użyciem metody powtórzeniowej (iteracyjnej):
W najpopularniejszej implementacji języka Python – CPython istnieje ograniczenie liczby możliwych do wykonania wywołań rekurencyjnych. Standardowo wynosi ona 1000
. Możemy zmienić tę wielkość, korzystając z funkcji setrecursionlimit()
należącej do modułu sys
. Powinniśmy jednak pamiętać, że we wszystkich systemach operacyjnych istnieją fizyczne ograniczenia liczby wykonywanych operacji rekurencyjnych. Wynikają one z ograniczeń pamięci przydzielanych dla stosu w różnych kompilatorach i systemach operacyjnych. Oto przykład wywołania zdefiniowanej wcześniej funkcji rek_silnia()
zakończony wygenerowaniem informacji o błędzie (później następuje zmiana limitu operacji, dzięki czemu funkcja zwraca poprawny wynik):
Spróbujmy określić maksymalną liczbę operacji rekurencyjnych, które można wykonać w naszym systemie operacyjnym. Oto przykładowy program sprawdzający tę wielkość:
Podsumujmy najważniejsze elementy z tego e‑materiału:
funkcja rekurencyjna wielokrotnie wywołuje samą siebie,
wykonanie funkcji wywoływanej rekurencyjnie wymaga większej ilości pamięci operacyjnej,
w języku Python istnieje limit możliwych do wykonania operacji rekurencyjnych.
Słownik
wielokrotne wykonywanie tych samych czynności
sytuacja, w której funkcja wywołuje samą siebie aż do napotkania przypadku podstawowego