R12192efrJ5bH
Grafika przedstawia dwa splecione symbole węży. Jeden jest niebieski, a drugi żółty.

Stosowanie funkcji w języku Python do realizacji algorytmu Euklidesa z odejmowaniem

Logo języka Python
Źródło: Dnu72, dostępny w internecie: commons.wikimedia.org, licencja: CC BY-SA 4.0.

Algorytm Euklidesa opisuje metodę znajdowania największego wspólnego dzielnika dwóch liczb naturalnych. Nazwa pochodzi od greckiego matematyka Euklidesa, który jako pierwszy opisał algorytm w IV w p.n.e., chociaż nie był jego autorem. Problem wyznaczania NWD rozwiązywany jest na wiele sposobów, w tym materiale wykorzystamy wersję opartą na odejmowaniu.

  1. Interaktywna treść merytorycznaInteraktywna treść merytoryczna

  2. MultimediumMultimedium

  3. Zestaw ćwiczeń interaktywnychZestaw ćwiczeń interaktywnych

  4. SłownikSłownik

  5. BibliografiaBibliografia

Aby zrozumieć poruszane w tym materiale zagadnienia, przypomnij sobie:
Twoje cele
  • Przeanalizujesz zapis algorytmu Euklidesa znajdowania NWD opartego na odejmowaniu.

  • Napiszesz program obliczający NWD dla liczb pobranych od użytkownika.

  • Zastosujesz instrukcję iteracyjną (pętlę) i instrukcję warunkową.

  • Zbadasz liczbę operacji potrzebnych do uzyskania wyniku.

1

NWD

Największy wspólny dzielnik (NWD) dwóch dodatnich liczb naturalnych ab to największa liczba naturalna d, która jest dzielnikiem każdej z nich, czyli dzieli je bez reszty. Przyjmijmy, że będziemy ją oznaczać jako d = NWD(a, b).

NWD ma wiele zastosowań, m.in. pozwala skracać ułamki zwykłe do postaci, w której licznik i mianownik są liczbami względnie pierwszymi, czyli NWD(a, b) = 1.

Algorytm Euklidesa z zastosowaniem odejmowania

Skonstruujemy algorytm, który obliczy największy wspólny dzielnik dwóch dodatnich liczb naturalnych.

Specyfikacja algorytmu:

Dane wejściowe:

  • a, b – dodatnie liczby naturalne

Wynik:

  • d - dodatnia liczba naturalna, NWD(a, b)

Do rozwiązania postawionego zadania użyjemy algorytmu Euklidesa w wersji z odejmowaniem.

Przykład 1

Przeanalizujmy wyznaczanie NWD według algorytmu Euklidesa z wykorzystaniem odejmowania dla danych: a = 4, b = 10.

Powtórzenia

a

b

działanie

1

4

10

b = 10 - 4

2

4

6

b = 6 - 4

3

4

2

a = 4 - 2

4

2

2

-

Liczba powtórzeń: 3.
Wynik: NWD (4, 10) = 2

Z powyższego przykładu wynika, że dopóki liczby ab są różne, w każdym powtórzeniu sprawdzamy, która liczba jest większa. Jeżeli a > b, obliczamy a = a - b, w przeciwnym razie wyliczamy b = b - a. Kiedy ab są równe, wynikiem jest dowolna z tych liczb.

Zapiszmy algorytm w postaci listy kroków:

  1. Wczytaj a, b.

  2. Jeżeli a jest równe b, przejdź do kroku 5.

  3. Jeżeli a > b, zmiennej a przypisz a - b, w przeciwnym razie zmiennej b przypisz b - a.

  4. Przejdź do kroku 2.

  5. Wypisz a i zakończ algorytm.

Przeanalizujmy również schemat blokowy algorytmu:

R7eTw2k5l821C1
Schemat blokowy algorytmu
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

Z obydwu sposobów zapisu algorytmu wynika, że na początku pobieramy dane wejściowe, czyli dwie dodatnie liczby naturalne. Następnie porównujemy je i większą pomniejszamy o mniejszą. Operacje te powtarzają się, gdy liczby ab są różne. Kiedy zrównają się, wyprowadzamy wynik, tj. dowolną z tych liczb, i kończymy.

Zapis algorytmu w postaci programu

Napiszemy prosty program, który będzie obliczał NWD według omówionego algorytmu.

Do kodowania użyj dostępnego w swoim środowisku edytora, np. IDLE dołączonego do standardowej instalacji Pythona.

Przykład 2

Kopiujemy poniższy kod, wklejamy do pustego pliku i zapisujemy pod nazwą np. nwd_odejmowanie.py.

Linia 1. kratka pobierz liczbę naturalną a. Linia 4. kratka pobierz liczbę naturalną b. Linia 7. kratka pętla obliczająca NWD. Linia 10. kratka wypisanie wyniku. Linia 11. print otwórz nawias okrągły cudzysłów NWD otwórz nawias okrągły cudzysłów przecinek a przecinek cudzysłów przecinek cudzysłów przecinek b przecinek cudzysłów zamknij nawias okrągły znak równości cudzysłów przecinek a zamknij nawias okrągły.

Dane

Jak wynika z komentarzy w kodzie programu, na początku musimy pobrać dane, czyli dwie dodatnie liczby naturalne.

1
Polecenie 1

W pliku nwd_odejmowanie.py poniżej odpowiednich komentarzy dodaj instrukcje pobierania z klawiatury dwóch liczb naturalnych i zapamiętywania ich pod nazwami ab. Użyj funkcji input()int().

R6KgkZcjyvCgo
Wymyśl pytanie na kartkówkę związane z tematem materiału.

Pętla

W najważniejszej części algorytmu porównujemy podane liczby, dopóki nie są równe. Warunek ten możemy zapisać jako a != b. Ponieważ nie wiemy, ile trzeba powtórzeń, aby uzyskać wynik, w programie musimy użyć pętli while. Wewnątrz pętli do sprawdzania, która z liczb jest większa, będziemy potrzebowali instrukcji warunkowej if badającej warunek a > b. Do zakodowania operacji zmniejszania większej liczby o mniejszą użyjemy instrukcji przypisania, np. a = a - b.

Polecenie 2

W pliku nwd_odejmowanie.py pod komentarzem pętla obliczająca NWD zapisz:

  • pętlę, sprawdzającą warunek a != b – użyj instrukcji while,

  • wewnątrz pętli warunek a > b oraz operacje zmniejszania a = a - b lub b = b - a – użyj instrukcji warunkowej if.

R6KgkZcjyvCgo
Wymyśl pytanie na kartkówkę związane z tematem materiału.

Przetestujmy działanie napisanego programu.

1
Polecenie 3

Uruchom program nwd_odejmowanie.py i przetestuj jego działanie dla przykładowych danych:

Linia 1. kratka Pierwszy zestaw danych. Linia 2. a znak równości 4. Linia 3. b znak równości 10. Linia 5. kratka Drugi zestaw danych. Linia 6. a znak równości 1020. Linia 7. b znak równości 20.
R6KgkZcjyvCgo
Wymyśl pytanie na kartkówkę związane z tematem materiału.

Użycie funkcji

Obliczanie NWD to operacja, którą można w programie wykonywać wielokrotnie, np. gdy umożliwimy użytkownikowi wielokrotne podawanie liczb wejściowych. Kod realizujący tę operację umieścimy więc w funkcjifunkcjafunkcji, która do działania będzie wymagała dwóch parametrówparametry i argumenty funkcjiparametrów, tzn. pobranych liczb.

Polecenie 4

Plik nwd_odejmowanie.py zapisz pod nazwą nwd_odejmowanie_funkcja.py.

Na początku pliku nwd_odejmowanie_funkcja.py umieść definicję funkcji oblicz_nwd().

Linia 1. def oblicz podkreślnik nwd otwórz nawias okrągły a przecinek b zamknij nawias okrągły dwukropek. Linia 2. kratka kod pętli. Linia 3. otwórz nawias ostrokątny code style znak równości cudzysłów white minus space dwukropek pre średnik cudzysłów data minus inline zamknij nawias ostrokątny otwórz nawias ostrokątny prawy ukośnik code zamknij nawias ostrokątny.
R6KgkZcjyvCgo
Wymyśl pytanie na kartkówkę związane z tematem materiału.

W ciele funkcji należy umieścić zasadniczą część algorytmu, czyli pętlę obliczającą NWD.

1
Polecenie 5

W pliku nwd_odejmowanie_funkcja.py w funkcji oblicz_nwd() pod komentarzem kod pętli umieść kod pętli obliczającej NWD.

Wskazówka: zaznacz, wytnij i wklej dotychczasowy kod pętli razem z komentarzem pętla obliczająca NWD. Zwróć uwagę na poprawne wcięcia kodu.

R6KgkZcjyvCgo
Wymyśl pytanie na kartkówkę związane z tematem materiału.

Zwracanie wartości z funkcji

Po umieszczeniu pętli wyznaczającej NWD w funkcji musimy zdecydować, co zrobimy z wynikiem jej działania, tzn. ze zmienną a, która zawiera NWD. Moglibyśmy od razu wypisać wynik, ale w funkcjach, które coś obliczają, zazwyczaj się tego nie robi, chyba że testujemy ich działanie. Wynik działania funkcji najczęściej zwracamy do miejsca wywołania po to, żeby go wykorzystać, np. wypisać w terminalu albo użyć w dalszych obliczeniach.

Do zwracania wartości z funkcji używamy instrukcji return wyrażenie. Wyrażeniem może być zmienna, kilka zmiennych czy nawet wynik wywołania innej funkcji. W naszym przypadku wystarczy, że po pętli umieścimy instrukcję return a.

1
Polecenie 6

W pliku nwd_odejmowanie_funkcja.py na końcu funkcji oblicz_nwd() umieść instrukcję zwracającą wynik: return a. Zwróć uwagę na jej wcięcie, powinno odpowiadać pętli while.

R6KgkZcjyvCgo
Wymyśl pytanie na kartkówkę związane z tematem materiału.

Wywołanie funkcji

Wykonywanie naszego programu rozpoczyna się od pobrania dwóch liczb od użytkownika. Po pobraniu tych danych musimy umieścić wywołaniewywołanie funkcjiwywołanie naszej funkcji w postaci oblicz_nwd(a, b). Liczby ab przekazujemy jako argumenty.

Funkcja oblicz_nwd() zwraca wynik do miejsca wywołania. Możemy go przypisać do zmiennej d, a na koniec wypisać.

1
Polecenie 7

W pliku nwd_odejmowanie_funkcja.py po instrukcjach pobierania danych wejściowych umieść instrukcję przypisania i wywołania funkcji:

Linia 1. d znak równości oblicz podkreślnik nwd otwórz nawias okrągły zamknij nawias okrągły.

Końcową instrukcję print() zastąp kodem:

Linia 1. print otwórz nawias okrągły cudzysłów NWD otwórz nawias okrągły cudzysłów przecinek a przecinek cudzysłów przecinek cudzysłów przecinek b przecinek cudzysłów zamknij nawias okrągły znak równości cudzysłów przecinek d zamknij nawias okrągły.
R6KgkZcjyvCgo
Wymyśl pytanie na kartkówkę związane z tematem materiału.

Użycie funkcji ma jeszcze jedną zaletę – ułatwia wypisywanie komunikatu końcowego.

Notatnik

RwQTyLx3QQNTf
Miejsce na Twoje notatki: (Uzupełnij).
2

Film

Polecenie 8

Zapoznaj się z animacją, która pokazuje, w jaki sposób możemy uzyskać odpowiedź na pytanie o to, ile trzeba wykonać operacji odejmowania, zanim znajdziemy największy wspólny dzielnik z wykorzystaniem algorytmu Euklidesa.

R1E3bvJEBiR8S
Animacja pod tytułem Największy wspólny dzielnik

Program nwd_odejmowanie_licznik.py zaprezentowany w animacji:

RtHYN7flOUvq1

Plik do pobrania z kodem źródłowym programu.

Plik PY o rozmiarze 574.00 B w języku polskim
1
Polecenie 9

Uruchom program nwd_odejmowanie_licznik.py i przetestuj jego działanie dla podanych danych:

Linia 1. kratka Pierwszy zestaw danych. Linia 2. a znak równości 8. Linia 3. b znak równości 32. Linia 5. kratka Drugi zestaw danych. Linia 6. a znak równości 8. Linia 7. b znak równości 2848. Linia 9. kratka Trzeci zestaw danych. Linia 10. a znak równości 2. Linia 11. b znak równości 10. Linia 13. kratka Czwarty zestaw danych. Linia 14. a znak równości 2. Linia 15. b znak równości 22222.
RlvYg4byQuiPH
Wysłuchaj fragmentu książki innego filozofa, Oswalda Spenglera, pt. Zmierzch Zachodu (1918). Zastanów się i wyjaśnij tezę, iż cywilizacja jest dopełnieniem i zakończeniem kultury. Jak ma się ona do kryzysu Zachodu? (Uzupełnij).
1
Polecenie 10

Do wykonania polecenia wykorzystaj następujące dwa zestawy danych:

Linia 1. kratka Pierwszy zestaw danych. Linia 2. a znak równości 34. Linia 3. b znak równości 16. Linia 5. kratka Drugi zestaw danych. Linia 6. a znak równości 16. Linia 7. b znak równości 34.
R1dQ7DWSQpJk9
Wysłuchaj fragmentu książki innego filozofa, Oswalda Spenglera, pt. Zmierzch Zachodu (1918). Zastanów się i wyjaśnij tezę, iż cywilizacja jest dopełnieniem i zakończeniem kultury. Jak ma się ona do kryzysu Zachodu? (Uzupełnij).
Polecenie 11
R1YSudRpoDHj7
Wysłuchaj fragmentu książki innego filozofa, Oswalda Spenglera, pt. Zmierzch Zachodu (1918). Zastanów się i wyjaśnij tezę, iż cywilizacja jest dopełnieniem i zakończeniem kultury. Jak ma się ona do kryzysu Zachodu? (Uzupełnij).
3

Zestaw ćwiczeń interaktywnych

RY9rpifYMr52W
Ćwiczenie 1
Przykładowy wygląd zakładki zadania. Pod poleceniem znajdują się panele z tekstem z miejscem do oznaczenia prawidłowej odpowiedzi. Poniżej znajduje się panel z napisem SPRAWDŹ a pod nim napis Pokaż odpowiedź.
Źródło: Robert Bednarz, licencja: CC BY 3.0.
REjm0EzD1sX4T
Ćwiczenie 2
Przykładowy wygląd zakładki zadania. Pod poleceniem znajdują się panele z tekstem z miejscem do oznaczenia prawidłowej odpowiedzi. Poniżej znajduje się panel z napisem SPRAWDŹ a pod nim napis Pokaż odpowiedź.
Źródło: Robert Bednarz, licencja: CC BY 3.0.
RRvpBsyDPhSUv
Ćwiczenie 3
Przykładowy wygląd zakładki zadania. Pod poleceniem znajdują się panele z tekstem z miejscem do oznaczenia prawidłowej odpowiedzi. Poniżej znajduje się panel z napisem SPRAWDŹ a pod nim napis Pokaż odpowiedź.
Źródło: Robert Bednarz, licencja: CC BY 3.0.
RARugbyugq6pi
Ćwiczenie 4
Przykładowy wygląd zakładki zadania. Pod poleceniem znajdują się panele z tekstem z miejscem do oznaczenia prawidłowej odpowiedzi. Poniżej znajduje się panel z napisem SPRAWDŹ a pod nim napis Pokaż odpowiedź.
Źródło: Robert Bednarz, licencja: CC BY 3.0.
1
Ćwiczenie 5
Rq5QSmwpt0Ywx
Wysłuchaj fragmentu książki innego filozofa, Oswalda Spenglera, pt. Zmierzch Zachodu (1918). Zastanów się i wyjaśnij tezę, iż cywilizacja jest dopełnieniem i zakończeniem kultury. Jak ma się ona do kryzysu Zachodu? (Uzupełnij).
R1VFoXMOoCetq
Ćwiczenie 6
Przykładowy wygląd zakładki zadania. Pod poleceniem znajdują się panele ułożone po cztery w dwóch rzędach. Każdy z paneli zawiera treści do połączenia w pary. Poniżej znajduje się panel z napisem SPRAWDŹ a pod nim napis Pokaż odpowiedź.
Źródło: Robert Bednarz, licencja: CC BY 3.0.
R1HCfFx0WnV16
Ćwiczenie 7
Przykładowy wygląd zakładki zadania. Pod poleceniem znajdują się panele z tekstem z miejscem do oznaczenia prawidłowej odpowiedzi. Poniżej znajduje się panel SPRAWDŹ a pod nim napis Pokaż odpowiedź.
Źródło: Robert Bednarz, licencja: CC BY 3.0.
11
Ćwiczenie 8

Wykonaj kolejne ćwiczenia.

R1A9wBV4KXzaF
Źródło: GroMar, licencja: CC BY 3.0.
4

Słownik

funkcja
funkcja

wyodrębniony i nazwany blok kodu zawierający instrukcje wykonujące najczęściej jedno zadanie, w Pythonie rozpoczyna się nagłówkiem: def nazwa_funkcji():

parametry i argumenty funkcji
parametry i argumenty funkcji

parametry to zmienne umieszczane w nawiasach okrągłych po nazwie funkcji, które symbolizują wartości wymagane do jej działania, natomiast argumenty to wartości podawane w nawiasach okrągłych po nazwie funkcji w miejscu jej wywołania

wywołanie funkcji
wywołanie funkcji

uruchomienie funkcji polegające na wpisaniu jej nazwy, nawiasów i podaniu argumentów

5

Bibliografia

  • Największy wspólny dzielnik https://encyklopedia.pwn.pl/szukaj/najwi%C4%99kszy%20wsp%C3%B3lny%20dzielnik.html [dostęp 2022‑07‑07].

  • Sysło M.M., Algorytmy, Helion, Gliwice 2016.