Schemat Hornera – wersja rekurencyjna

Zapiszmy, krok po kroku, algorytm schematu Hornera w wersji rekurencyjnejrekurencjarekurencyjnej.

Krok 1.

Zapiszmy nagłówek naszej funkcji:

Linia 1. int hornerRekurencyjnie otwórz nawias okrągły int wspolczynniki otwórz nawias kwadratowy zamknij nawias kwadratowy przecinek int stopienWielomianu przecinek int x zamknij nawias okrągły.

Składa się on z następujących elementów:

  • typu zwracanych wartości przez funkcję – w tym przypadku może to być zarówno int, float, jak i double,

  • nazwy funkcji hornerRekurencyjnie,

  • argumentów funkcji zapisanych w okrągłych nawiasach.

Pierwszym z argumentów jest tablica wspolczynniki zawierająca wszystkie współczynniki znajdujące się przy kolejnych potęgach naszego wielomianu. Kolejnym argumentem jest stopienWielomianu. Jest to zmienna, w której przechowywana jest największa potęga naszego wielomianu. Ostatnim argumentem jest zmienna x. Jest to argument, dla którego będziemy obliczali wartość wielomianu.

Krok 2.

Kolejnym krokiem jest ustalenie warunku przerwania rekurencji. Tym warunkiem będzie to, czy zmienna stopienWielomianu jest równa 0.

Linia 1. if otwórz nawias okrągły stopienWielomianu znak równości znak równości 0 zamknij nawias okrągły.

Krok 3.

Jeśli warunek zapisany w kroku 2 jest spełniony, zwracamy współczynnik z indeksem zero – jest to wyraz wolny naszego wielomianu.

Linia 1. return wspolczynniki otwórz nawias kwadratowy 0 zamknij nawias kwadratowy średnik.

Krok 4.

Jeśli nasz warunek nie jest spełniony, zwracamy argument, dla którego obliczamy wartość wielomianu pomnożoną przez wartość, jaką zwróci nam wywołana rekurencyjnie funkcja hornerRekurencyjnie() z argumentami wspolczynniki, stopienWielomianu - 1, x oraz dodanym współczynnikiem zapisanym pod indeksem stopienWielomianu.

Linia 1. return x asterysk hornerRekurencyjnie otwórz nawias okrągły wspolczynniki przecinek stopienWielomianu ‑ 1 przecinek x zamknij nawias okrągły plus wspolczynniki otwórz nawias kwadratowy stopienWielomianu zamknij nawias kwadratowy średnik.

Algorytm obliczający wartość wielomianu zapisany w wersji rekurencyjnej zaimplementowany w języku C++ wygląda następująco:

Linia 1. int hornerRekurencyjnie otwórz nawias okrągły int wspolczynniki otwórz nawias kwadratowy zamknij nawias kwadratowy przecinek int stopienWielomianu przecinek int x zamknij nawias okrągły. Linia 2. otwórz nawias klamrowy. Linia 4. if otwórz nawias okrągły stopienWielomianu znak równości znak równości 0 zamknij nawias okrągły. Linia 5. return wspolczynniki otwórz nawias kwadratowy 0 zamknij nawias kwadratowy średnik. Linia 6. else. Linia 7. return x asterysk hornerRekurencyjnie otwórz nawias okrągły wspolczynniki przecinek stopienWielomianu minus 1 przecinek x zamknij nawias okrągły plus wspolczynniki otwórz nawias kwadratowy stopienWielomianu zamknij nawias kwadratowy średnik. Linia 8. zamknij nawias klamrowy.

Sprawdźmy jego działanie dla przykładowych danych. Przetestujemy działanie programu dla następującego wielomianu:

W(x) = x2 + 3x - 6

oraz x = 2.

Linia 1. kratka include otwórz nawias ostrokątny iostream zamknij nawias ostrokątny. Linia 2. using namespace std średnik. Linia 4. int hornerRekurencyjnie otwórz nawias okrągły int wspolczynniki otwórz nawias kwadratowy zamknij nawias kwadratowy przecinek int stopienWielomianu przecinek int x zamknij nawias okrągły. Linia 5. otwórz nawias klamrowy. Linia 7. if otwórz nawias okrągły stopienWielomianu znak równości znak równości 0 zamknij nawias okrągły. Linia 8. return wspolczynniki otwórz nawias kwadratowy 0 zamknij nawias kwadratowy średnik. Linia 9. else. Linia 10. return x asterysk hornerRekurencyjnie otwórz nawias okrągły wspolczynniki przecinek stopienWielomianu minus 1 przecinek x zamknij nawias okrągły plus wspolczynniki otwórz nawias kwadratowy stopienWielomianu zamknij nawias kwadratowy średnik. Linia 11. zamknij nawias klamrowy. Linia 13. int main otwórz nawias okrągły zamknij nawias okrągły. Linia 14. otwórz nawias klamrowy. Linia 15. int wspolczynniki otwórz nawias kwadratowy zamknij nawias kwadratowy znak równości otwórz nawias klamrowy 1 przecinek 3 przecinek minus 6 zamknij nawias klamrowy średnik. Linia 16. int stopienWielomianu znak równości 2 średnik. Linia 17. int x znak równości 2 średnik. Linia 18. cout otwórz nawias ostrokątny otwórz nawias ostrokątny hornerRekurencyjnie otwórz nawias okrągły wspolczynniki przecinek stopienWielomianu przecinek x zamknij nawias okrągły średnik. Linia 20. return 0 średnik. Linia 21. zamknij nawias klamrowy.

Program na wyjściu daje liczbę 4, co jest poprawnym wynikiem.

rekurencja
rekurencja

technika programowania polegająca na odwoływaniu się procedur lub funkcji do samych siebie, aż do momentu spełnienia warunku podstawowego