R1ZTXA71T59C7

I_R_W14_M30_C++ Schemat Hornera - efektywna metoda obliczania wartości wielomianów

Algorytm zapisany w sposób rekurencyjny

W kolejnych krokach zaprezentujemy algorytm obliczania schematu Hornera zapisany metodą rekurencyjnąrekurencjametodą rekurencyjną.

Definicja rekurencyjna tego algorytmu:

  • aIndeks dolny 0 = wspolczynniki[0]

  • aIndeks dolny n = x * aIndeks dolny n‑1 + wspolczynniki[n] dla n>0

Krok 1

Wczytaj dane w taki sposób, jak w algorytmie iteracyjnym.

Krok 2

Wywołaj funkcję Horner(), podając jako argumenty: wspolczynniki, stopienWielomianu, x.

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

Krok 3

W funkcji Horner() sprawdź, czy stopienWielomianu jest równy zero.

Linia 1. funkcja Horner otwórz nawias okrągły wspolczynniki otwórz nawias kwadratowy zamknij nawias kwadratowy przecinek stopienWielomianu przecinek x zamknij nawias okrągły. Linia 2. jeżeli stopienWielomianu znak równości znak równości 0 wykonaj dwukropek.

Krok 4

Jeśli tak jest, zwróć wspolczynniki[0]. Jest to przypadek bazowyprzypadek bazowy w rekurencjiprzypadek bazowy w naszej funkcji rekurencyjnej.

Linia 1. funkcja Horner otwórz nawias okrągły wspolczynniki otwórz nawias kwadratowy zamknij nawias kwadratowy przecinek stopienWielomianu przecinek x zamknij nawias okrągły. Linia 2. jeżeli stopienWielomianu znak równości znak równości 0 dwukropek. Linia 3. zwróć wspolczynniki otwórz nawias kwadratowy 0 zamknij nawias kwadratowy.

Krok 5

Jeśli tak nie jest, zwróć:

Linia 1. x asterysk Horner 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.

Oto gotowa funkcja:

Linia 1. wypisz cudzysłów Podaj stopień wczytywanego wielomianu dwukropek cudzysłów. Linia 2. stopienWielomianu znak równości wprowadź liczbę całkowitą. Linia 3. dla i znak równości 0 przecinek 1 przecinek 2 kropka kropka kropka stopienWielomianu wykonuj dwukropek. Linia 4. wypisz cudzysłów Podaj cudzysłów. Linia 5. wypisz i. Linia 6. wypisz cudzysłów współczynnik cudzysłów. Linia 7. wspolczynniki otwórz nawias kwadratowy i zamknij nawias kwadratowy znak równości wczytaj liczbę. Linia 8. Wyswietl cudzysłów Podaj argument przecinek dla którego chcesz obliczyć wartość wielomianu dwukropek cudzysłów. Linia 9. x znak równości wczytaj liczbę. Linia 10. wynik znak równości Horner otwórz nawias okrągły wspolczynniki przecinek stopienWielomianu przecinek x zamknij nawias okrągły. Linia 11. wypisz cudzysłów Wynik znak równości cudzysłów. Linia 12. wypisz x. Linia 14. funkcja Horner otwórz nawias okrągły wspolczynniki otwórz nawias kwadratowy zamknij nawias kwadratowy przecinek stopienWielomianu przecinek x zamknij nawias okrągły. Linia 15. jeżeli stopienWielomianu znak równości znak równości 0 wykonaj. Linia 16. zwróć wspolczynniki otwórz nawias kwadratowy 0 zamknij nawias kwadratowy. Linia 17. w przeciwnym razie wykonaj dwukropek. Linia 18. zwróć x asterysk Horner 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.

Przykładowe wykonanie algorytmu rekurencyjnego

Oblicz wartość wielomianu, wykorzystując schemat Hornera:

x 4 + 2 x 3 + x 15

dla argumentu x = 4.

Dane po wczytaniu:

stopienWielomianu = 4 
x = 4 
wspolczynniki = {1, 2, 0, 1, -15}

Współczynnik zapisany pod indeksem 2 ma wartość zero, ponieważ w naszym wielomianie nie ma zapisanego xIndeks górny 2.

Krok 1

Wywołaj funkcję Horner(wspolczynniki, stopienWielomianu, x).

Krok 2

Sprawdź, czy stopienWielomianu jest równy 0.

Krok 3

W tym przypadku tak nie jest, zwróć:

x * Horner(wspolczynniki,stopienWielomianu - 1,x) + wspolczynniki[stopienWielomianu]

Krok 4

Sprawdź, czy stopienWielomianu jest równy 0.

Krok 5

W tym przypadku tak nie jest, ponieważ stopienWielomianu = 3. Zwróć:

x * Horner(wspolczynniki,stopienWielomianu - 1,x) + wspolczynniki[stopienWielomianu]

Krok 6

Sprawdź, czy stopienWielomianu jest równy 0.

Krok 7

W tym przypadku tak nie jest, ponieważ stopienWielomianu = 2. Zwróć:

x * Horner(wspolczynniki,stopienWielomianu - 1,x) + wspolczynniki[stopienWielomianu]

Krok 8

Sprawdź, czy stopienWielomianu jest równy 0.

Krok 9

W tym przypadku tak nie jest, ponieważ stopienWielomianu = 1. Zwróć:

x * Horner(wspolczynniki,stopienWielomianu - 1,x) + wspolczynniki[stopienWielomianu]

Krok 10

Sprawdź, czy stopienWielomianu jest równy 0.

Krok 11

W tym przypadku tak jest. Zwróć wspolczynniki[0] równe 1.

Krok 12

Powróć do kroku 9.

x = 4

Funkcja Horner(wspolczynniki,stopienWielomianu - 1,x) zwróciła wartość wspolczynniki[0], co jest równe 1. Natomiast wspolczynniki[stopienWielomianu] jest równe 2.

Zatem:

4 1 + 2 = 6

Krok 13

Powróć do kroku 7.

x = 4

Funkcja Horner(wspolczynniki,stopienWielomianu - 1,x) zwróciła wartość obliczoną w kroku 12., co jest równe 6. Natomiast wspolczynniki[stopienWielomianu] jest równe 0.

Zatem:

4 6 + 0 = 24

Krok 14

Powróć do kroku 5.

x = 4

Funkcja Horner(wspolczynniki, stopienWielomianu - 1, x) zwróciła wartość obliczoną w kroku 13., co jest równe 24. Natomiast wspolczynniki[stopienWielomianu] jest równe 1.

Zatem:

4 24 + 1 = 97

Krok 15

Powróć do kroku 3.

x = 4

Funkcja Horner(wspolczynniki,stopienWielomianu - 1,x) zwróciła wartość obliczoną w kroku 13., co jest równe 97. Natomiast wspolczynniki[stopienWielomianu] jest równe -15.

4 97 + ( - 15 ) = 373
rekurencja
rekurencja

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

przypadek bazowy w rekurencji
przypadek bazowy w rekurencji

moment, gdy funkcja rekurencyjna zwraca konkretną wartość zamiast kolejnego wywołania rekurencyjnego