W tym materiale zaimplementujemy w języku C++ dwie wersje algorytmu: iteracyjną oraz rekurencyjną.

Specyfikacja problemu:

Dane:

  • wspolczynniki[] – tablica zawierająca liczby rzeczywiste (kolejne współczynniki wielomianu)

  • stopienWielomianu – liczba naturalna

  • x – liczba rzeczywista; argument, dla którego obliczana jest wartość wielomianu

Wynik:

  • wynik – liczba rzeczywista

Przykładowe wyjście:

Linia 1. Wartość wielomianu dla argumentu x znak równości 4.

Schemat Hornera – wersja iteracyjna

Zapiszmy krok po kroku algorytm obliczający wartość wielomianu w wersji iteracyjnejiteracjaiteracyjnej.

Krok 1.

Zapiszmy nagłówek naszej funkcji.

Najpierw zapisujemy typ zwracanych wartości przez naszą funkcję. W tym przypadku może to być zarówno typ int, float, double, jak i void. W przypadku funkcji typu void musimy w ciele funkcji zawrzeć wypisywanie na ekran obliczonej wartości.

Następnie zapisujemy nazwę naszej funkcji horner, a potem w okrągłych nawiasach zapisujemy argumenty funkcji. Pierwszym z argumentów jest tablica wspolczynniki zawierająca, jak sama nazwa wskazuje, 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 obliczać wartość wielomianu.

Linia 1. int hornerIteracyjnie 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.

Krok 2.

Deklarujemy zmienną wynik. Może być ona zarówno typu int, double, jak i float.

Linia 1. int wynik średnik.

Krok 3.

Kolejnym krokiem będzie przypisanie do zmiennej wynik wartości równej wyrazowi wolnemu w naszym wielomianie.

Linia 1. wynik znak równości wspolczynniki otwórz nawias kwadratowy 0 zamknij nawias kwadratowy średnik.

Krok 4.

Następnie tworzymy pętlę wykonującą się od i = 1 do i = stopienWielomianu. Zaczynamy pętlę od wartości równej 1, ponieważ wartość współczynnika wyrazu wolnego została uwzględniona w obliczeniach poza pętlą. Pętla wykonuje się do wartości równej stopienWielomianu, ponieważ zaczynamy od stopnia równego 1 i wykonujemy pętlę do momentu, w którym obliczymy cały wielomian.

Linia 1. for otwórz nawias okrągły int i znak równości 1 średnik i otwórz nawias ostrokątny znak równości stopienWielomianu średnik i plus plus zamknij nawias okrągły.

Krok 5.

W pętli do zmiennej wynik przypisujemy jej obecną wartość przemnożoną przez argument x, a do tego dodajemy zmienną zapisaną w tabeli wspolczynniki pod indeksem i.

Linia 1. wynik znak równości wynik asterysk x plus wspolczynniki otwórz nawias kwadratowy i zamknij nawias kwadratowy średnik.

Krok 6.

Po wykonaniu pętli dla funkcji typu void wypisujemy wartość zmiennej wynik w odpowiednim komunikacie.

Linia 1. cout otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów Wartość wielomianu dla argumentu x znak równości cudzysłów otwórz nawias ostrokątny otwórz nawias ostrokątny wynik średnik.

Dla funkcji typu całkowitego (int) zwracamy zmienną wynik

Linia 1. return wynik średnik.

Cały algorytm, włącznie z krokiem 6. zapisanym dla funkcji typu całkowitego, prezentuje się następująco:

Linia 1. int hornerIteracyjnie 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 3. int wynik znak równości wspolczynniki otwórz nawias kwadratowy 0 zamknij nawias kwadratowy średnik. Linia 5. for otwórz nawias okrągły int i znak równości 1 średnik i otwórz nawias ostrokątny znak równości stopienWielomianu średnik i plus plus zamknij nawias okrągły. Linia 6. wynik znak równości wynik asterysk x plus wspolczynniki otwórz nawias kwadratowy i zamknij nawias kwadratowy średnik. Linia 8. return wynik średnik. Linia 9. 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 hornerIteracyjnie 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 6. int wynik znak równości wspolczynniki otwórz nawias kwadratowy 0 zamknij nawias kwadratowy średnik. Linia 8. for otwórz nawias okrągły int i znak równości 1 średnik i otwórz nawias ostrokątny znak równości stopienWielomianu średnik i plus plus zamknij nawias okrągły. Linia 9. wynik znak równości wynik asterysk x plus wspolczynniki otwórz nawias kwadratowy i zamknij nawias kwadratowy średnik. Linia 11. return wynik średnik. Linia 12. zamknij nawias klamrowy. Linia 14. int main otwórz nawias okrągły zamknij nawias okrągły. Linia 15. otwórz nawias klamrowy. Linia 16. 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 17. int stopienWielomianu znak równości 2 średnik. Linia 18. int x znak równości 2 średnik. Linia 19. cout otwórz nawias ostrokątny otwórz nawias ostrokątny hornerIteracyjnie otwórz nawias okrągły wspolczynniki przecinek stopienWielomianu przecinek x zamknij nawias okrągły średnik. Linia 21. return 0 średnik. Linia 22. zamknij nawias klamrowy.

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

iteracja
iteracja

technika programowania polegająca na powtarzaniu tych samych operacji w pętli określoną liczbę razy lub do momentu, aż zostanie spełniony zadany warunek