R1GFQ6NNTMUDK
Obraz przedstawia wzór schematu Hornera zapisany na granatowym tle.

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

Źródło: Obraz wygenerowany za pomocą Copilot, domena publiczna.

Implementacja schematu Hornera - wersja rekurencyjna

Definiując funkcję rekurencyjną, będziemy musieli podać następujące dane wejściowe:

  • stopień wielomianu,

  • współczynniki kolejnych wyrazów wielomianu,

  • argument, dla którego obliczamy wartość wielomian.

1
Przykład 1

Wzór rekurencyjny obliczania wartości wielomianu za pomocą schematu Hornera możemy zapisać w następujący sposób:

Wn={a0dla n=0Wn1xx+andla n1

Zapiszemy algorytm rekurencyjny, który pozwala obliczyć wartość wielomianu z zastosowaniem schematu Hornera:

Linia 1. rek podkreślnik horner otwórz nawias okrągły stopien przecinek lista podkreślnik wspolczynnikow przecinek wartosc podkreślnik argumentu zamknij nawias okrągły. Linia 2. jesli stopien jest równy 0 przecinek zwróć lista podkreślnik wspolczynnikow otwórz nawias kwadratowy 0 zamknij nawias kwadratowy. Linia 3. w przeciwnym przypadku. Linia 4. zwróć otwórz nawias okrągły wartosc podkreślnik argumentu. Linia 5. asterysk rek podkreślnik horner otwórz nawias okrągły stopien minus 1 przecinek lista podkreślnik wspolczynnikow przecinek wartosc podkreślnik argumentu zamknij nawias okrągły. Linia 6. plus lista podkreślnik wspolczynnikow otwórz nawias kwadratowy stopien zamknij nawias kwadratowy zamknij nawias okrągły.

Zdefiniujmy funkcję, która wykorzystując algorytm rekurencyjny obliczy wartość wielomianu. Współczynniki towarzyszące poszczególnym jednomianom (czyli czynniki aIndeks dolny n w wyrażeniach anxn) podamy w kolejności od największego do najmniejszego wykładnika potęgi (od a0 do a3):

Linia 1. def rek podkreślnik horner otwórz nawias okrągły stopien przecinek lista podkreślnik wsp przecinek argument zamknij nawias okrągły dwukropek. Linia 2. if stopien znak równości znak równości 0 dwukropek. Linia 3. return lista podkreślnik wsp otwórz nawias kwadratowy stopien zamknij nawias kwadratowy. Linia 4. else dwukropek. Linia 5. return argument asterysk rek podkreślnik horner otwórz nawias okrągły stopien minus 1 przecinek lista podkreślnik wsp przecinek argument zamknij nawias okrągły plus lista podkreślnik wsp otwórz nawias kwadratowy stopien zamknij nawias kwadratowy. Linia 7. kratka przykład wywołania. Linia 8. print otwórz nawias okrągły rek podkreślnik horner otwórz nawias okrągły 3 przecinek otwórz nawias kwadratowy 6 przecinek 8 przecinek minus 2 przecinek 23 zamknij nawias kwadratowy przecinek 7 zamknij nawias okrągły zamknij nawias okrągły. Linia 9. 2459.

Sprawdźmy, ile operacji podstawowych trzeba wykonać w celu obliczenia wartości wielomianu z zastosowaniem metody rekurencyjnej.

Ważne!

Funkcja rekurencyjna wywołuje wielokrotnie siebie samą. W celu sprawdzenia liczby wykonywanych przez nią operacji musimy posłużyć się zmienną, która istnieje w przestrzeni nazw poza funkcją. Do tego celu użyjemy  zmiennej typu integer, który jest typem niezmiennym. Aby zmieniać wartość takiej zmiennej z wnętrza funkcji, musimy zadeklarować dostęp do niej za pomocą słowa kluczowego global. Dzięki temu będziemy mogli zmieniać wartość zmiennej, która istnieje „poza” funkcją, a jest niezmienna.

1
Przykład 2

Zdefiniujemy funkcję, która poda liczbę wykonanych operacji arytmetycznych podczas wyznaczania wartości wielomianu z zastosowaniem metody rekurencyjnej:

Linia 1. def rek podkreślnik horner podkreślnik licz otwórz nawias okrągły stopien przecinek lista podkreślnik wsp przecinek argument zamknij nawias okrągły dwukropek. Linia 2. global zlicz. Linia 4. if stopien znak równości znak równości 0 dwukropek. Linia 5. return lista podkreślnik wsp otwórz nawias kwadratowy stopien zamknij nawias kwadratowy. Linia 6. else dwukropek. Linia 7. zlicz plus znak równości 2 kratka jedno wywołanie funkcji to 2 operacje podstawowe. Linia 8. return argument asterysk rek podkreślnik horner podkreślnik licz otwórz nawias okrągły stopien minus 1 przecinek lista podkreślnik wsp przecinek argument zamknij nawias okrągły plus lista podkreślnik wsp otwórz nawias kwadratowy stopien zamknij nawias kwadratowy.

Spróbujmy uruchomić funkcję; pamiętajmy o wcześniejszym zadeklarowaniu zmiennej zlicz oraz o wyświetleniu jej wartości po zakończeniu działania funkcji:

Linia 1. kratka inicjujemy zmienną przecinek w której będziemy zliczać ilości wykonania. Linia 2. zlicz znak równości 0. Linia 4. kratka uruchamiamy właściwą funkcję. Linia 5. rek podkreślnik horner podkreślnik licz otwórz nawias okrągły 3 przecinek otwórz nawias kwadratowy 6 przecinek 8 przecinek minus 2 przecinek 23 zamknij nawias kwadratowy przecinek 7 zamknij nawias okrągły. Linia 7. kratka sprawdzamy wartość zmiennej. Linia 8. print otwórz nawias okrągły zlicz zamknij nawias okrągły. Linia 9. 6.
1
Polecenie 1

Bazując na postaci rekurencyjnej funkcji obliczającej wartość wielomianu, spróbujmy zapisać ją używając wyrażenia trójargumentowego.

Dla zainteresowanych

Dla języka Python opracowano moduł o nazwie SymPy – pozwala on na zapisywanie wyrażeń algebraicznych i obliczanie ich wartości.