W e‑materiale Algorytm EuklidesaP7OAFYVSiAlgorytm Euklidesa poznaliśmy algorytm służący do znajdowania największego wspólnego dzielnika dwóch liczb naturalnych. Wersję iteracyjną Algorytmu Euklidesa w języku Python omówiliśmy w e‑materiale Algorytm Euklidesa w języku PythonPsWD7mNY0Algorytm Euklidesa w języku Python. Tym razem zbadamy podejście rekurencyjne.

Algorytm Euklidesa z odejmowaniem – implementacja algorytmu w języku Python

Zaimplementujmy z użyciem rekurencji algorytm Euklidesa w języku Python.

W funkcji NWDNWDNWD(), która przyjmuje dwie zmienne, użylibyśmy instrukcji warunkowej if, w której warunek będzie taki sam, jak w przypadku pętli while w wykonaniu iteracyjnym, czyli a != b.

Jeżeli warunek jest spełniony, to znaczy a != b, funkcja będzie wywoływana rekurencyjnie. W przypadku gdy wartość a będzie większa od wartości b, funkcja zwróci NWD(a - b, b), a w przeciwnym przypadku NWD(a, b - a). W algorytmie korzystamy z równości NWD(a, b) = NWD(a - b, b) dla a > b lub NWD(a, b) = NWD(a, b- a) dla b > a, które pokazaliśmy w e‑materiale Algorytm EuklidesaP7OAFYVSiAlgorytm Euklidesa.

Jeżeli warunek nie jest spełniony, funkcja zwróci a. Oczywiście mogłaby też zwrócić b – jeżeli warunek nie zostanie spełniony, będzie to oznaczać, że wartość obu zmiennych jest identyczna.

Nasza funkcja wygląda następująco:

Linia 1. def NWD otwórz nawias okrągły a przecinek b zamknij nawias okrągły dwukropek. Linia 2. if a wykrzyknik znak równości b dwukropek. Linia 3. if a zamknij nawias ostrokątny b dwukropek. Linia 4. return NWD otwórz nawias okrągły a minus b przecinek b zamknij nawias okrągły. Linia 5. else dwukropek. Linia 6. return NWD otwórz nawias okrągły a przecinek b minus a zamknij nawias okrągły. Linia 7. return a.

Algorytm Euklidesa z dzieleniem – implementacja algorytmu w języku Python

Zadeklarujemy funkcję NWD(). Przyjmie ona parametry ab. W ciele funkcji umieścimy instrukcję warunkową if, której testem logicznym będzie b != 0. Jeżeli zależność zachodzi, funkcja zwróci samą siebie z argumentami ba % b. W przeciwnym razie funkcja zwróci zmienną a. Kod wygląda następująco:

Linia 1. def NWD otwórz nawias okrągły a przecinek b zamknij nawias okrągły dwukropek. Linia 2. if b wykrzyknik znak równości 0 dwukropek. Linia 3. return NWD otwórz nawias okrągły b przecinek a procent b zamknij nawias okrągły. Linia 4. else dwukropek. Linia 5. return a.

Istotne jest, żeby funkcja zwróciła przypadek podstawowyprzypadek podstawowyprzypadek podstawowy w momencie, gdy b przyjmie wartość 0. W innym przypadku w następnym wywołaniu funkcji pojawiłby się argument, który doprowadziłby do wykonania operacji niedozwolonej, czyli szukania reszty z dzielenia przez 0.

Słownik

konkatenacja
konkatenacja

łączenie ze sobą łańcuchów znaków

modulo
modulo

reszta z dzielenia dwóch liczb całkowitych, w języku Python oznaczana znakiem % (procent), np.: 22 % 5 = 2

NWD
NWD

największy wspólny dzielnik dwóch liczb naturalnych – największa liczba naturalna, która dzieli obie te liczby bez reszty

przypadek podstawowy
przypadek podstawowy

przypadek, w którym funkcja rekurencyjna zwraca konkretną wartość, a nie wywołanie samej siebie

rekurencja
rekurencja

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