Dzięki funkcjom rekurencyjnymrekurencjarekurencyjnym możemy uzyskać różne znane fraktalefraktalfraktale. Są to między innymi:

  • zbiór Cantora,

  • płatek Kocha,

  • dywan Sierpińskiego,

  • drzewo binarne.

Do tworzenia takich obrazów w języku Python doskonale nadaje się moduł turtleturtleturtle.

Ważne!

W funkcjach będziemy wykorzystywać obiekt klasy Turtle do utworzenia obiektu żółwia. Ponieważ funkcja rekurencyjna wywołuje samą siebie wielokrotnie, obiekt żółwia musi być do niej przekazany jako jeden z parametrów. W przeciwnym razie wyniki działania funkcji rekurencyjnej mogłyby być nieprzewidywalne.

Linia 1. from turtle import Turtle. Linia 2. zlw znak równości Turtle otwórz nawias okrągły zamknij nawias okrągły kratka definicja obiektu żółwia. Linia 4. def funkcja podkreślnik rekurencyjna otwórz nawias okrągły obiekt podkreślnik zolwia przecinek kropka kropka kropka zamknij nawias okrągły dwukropek. Linia 5. pass. Linia 7. kratka wywołanie. Linia 8. funkcja podkreślnik rekurencyjna otwórz nawias okrągły zlw przecinek kropka kropka kropka zamknij nawias okrągły.

Algorytm opisowy do generowania dywanu Sierpińskiego

Dywan Sierpińskiego otrzymujemy z kwadratu przez podzielenie go na dziewięć mniejszych kwadratów (3 x 3). Następnie środkowy kwadrat zostaje zamalowany. Ponownie rekurencyjnie wywołujemy tę funkcję dla każdego z pozostałych kwadratów.

1
Przykład 1

Spróbujmy zdefiniować algorytm tworzenia geometrycznej prezentacji:

Linia 1. dywan podkreślnik sierpinskiego otwórz nawias okrągły stopien przecinek dlugosc podkreślnik boku zamknij nawias okrągły. Linia 3. jeśli stopien jest równy 0. Linia 4. narysuj kwadrat o dlugosc podkreślnik boku w kolorze turkusowym. Linia 5. zakończ. Linia 6. w innym przypadku. Linia 7. narysuj kwadrat o dlugosc podkreślnik boku w kolorze białym. Linia 8. powtórz 4 razy. Linia 9. powtórz 2 razy. Linia 10. wywołaj dywan podkreślnik sierpinskiego otwórz nawias okrągły stopien minus 1 przecinek dlugosc podkreślnik boku prawy ukośnik 3 zamknij nawias okrągły. Linia 11. przesuń się do przodu o dlugosc podkreślnik boku prawy ukośnik 3. Linia 13. przesuń się do przodu o dlugosc podkreślnik boku prawy ukośnik 3. Linia 14. obróć się w prawo o 90 stopni.

Na podstawie powyższego opisu zapiszemy kod funkcji:

Linia 1. def dywan podkreślnik sierpinskiego otwórz nawias okrągły z przecinek stopien przecinek dl podkreślnik bok zamknij nawias okrągły dwukropek. Linia 3. def kwadrat otwórz nawias okrągły bok przecinek kolor zamknij nawias okrągły dwukropek. Linia 4. z kropka color otwórz nawias okrągły kolor zamknij nawias okrągły. Linia 5. z kropka begin podkreślnik fill otwórz nawias okrągły zamknij nawias okrągły. Linia 6. for i in range otwórz nawias okrągły 4 zamknij nawias okrągły dwukropek. Linia 7. z kropka forward otwórz nawias okrągły bok zamknij nawias okrągły. Linia 8. z kropka right otwórz nawias okrągły 90 zamknij nawias okrągły. Linia 9. z kropka end podkreślnik fill otwórz nawias okrągły zamknij nawias okrągły. Linia 11. if stopien znak równości znak równości 0 dwukropek. Linia 12. kwadrat otwórz nawias okrągły dl podkreślnik bok przecinek apostrof black apostrof zamknij nawias okrągły. Linia 13. return None. Linia 14. else dwukropek. Linia 15. kwadrat otwórz nawias okrągły dl podkreślnik bok przecinek apostrof white apostrof zamknij nawias okrągły. Linia 16. for i in range otwórz nawias okrągły 4 zamknij nawias okrągły dwukropek. Linia 17. for j in range otwórz nawias okrągły 2 zamknij nawias okrągły dwukropek. Linia 18. dywan podkreślnik sierpinskiego otwórz nawias okrągły z przecinek stopien minus 1 przecinek dl podkreślnik bok prawy ukośnik 3 zamknij nawias okrągły. Linia 19. z kropka forward otwórz nawias okrągły dl podkreślnik bok prawy ukośnik 3 zamknij nawias okrągły. Linia 20. z kropka forward otwórz nawias okrągły dl podkreślnik bok prawy ukośnik 3 zamknij nawias okrągły. Linia 21. z kropka right otwórz nawias okrągły 90 zamknij nawias okrągły.

Efekt wykonania algorytmu wygląda następująco:

Linia 1. kratka poniższe wiersze niezbędne są dla wykonania. Linia 2. from turtle import Turtle. Linia 3. zl znak równości Turtle otwórz nawias okrągły zamknij nawias okrągły. Linia 5. kratka przenosimy żółwia w konkretne miejsce układu współrzędnych. Linia 6. kratka aby narysowany obraz dobrze mieścił się w oknie. Linia 7. zl kropka penup otwórz nawias okrągły zamknij nawias okrągły. Linia 8. zl kropka goto otwórz nawias okrągły minus 300 przecinek 300 zamknij nawias okrągły. Linia 9. zl kropka pendown otwórz nawias okrągły zamknij nawias okrągły. Linia 11. dywan podkreślnik sierpinskiego otwórz nawias okrągły zlw przecinek 3 przecinek 500 zamknij nawias okrągły.
R11c8pYfgKo8V
Dywan Sierpińskiego - efekt po wykonaniu kilku pierwszych kroków
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

Algorytm opisowy do generowania zbioru Cantora

Zbiór Cantora to odcinek, z którego wycinamy część środkową, pozostawiając odcinki pierwszej i trzeciej części. Następnie analogicznie postępujemy z każdą z pozostałych części. W każdym kolejnym kroku liczba części odcinka zwiększa się dwukrotnie, a długość narysowanych odcinków maleje. Kolejne kroki narysowane jeden pod drugim tworzą układ fraktalny.

1
Przykład 2

Spróbujmy zdefiniować algorytm tworzenia geometrycznej prezentacji:

Linia 1. zbiór podkreślnik cantora otwórz nawias okrągły długość podkreślnik linii przecinek wycięcie przecinek liczba podkreślnik linii zamknij nawias okrągły. Linia 3. jeśli liczba podkreślnik linii jest równa 0. Linia 4. narysuj podkreślnik odcinek podkreślnik długości długość podkreślnik linii. Linia 5. w przeciwnym wypadku. Linia 6. nowa podkreślnik długość znak równości długość podkreślnik linii asterysk otwórz nawias okrągły otwórz nawias okrągły 1 minus wycięcie zamknij nawias okrągły prawy ukośnik 2 zamknij nawias okrągły. Linia 7. przenieś podkreślnik pisak. Linia 8. zbiór podkreślnik cantora otwórz nawias okrągły nowa podkreślnik długość przecinek wycięcie przecinek liczba podkreślnik linii minus 1 zamknij nawias okrągły. Linia 9. przenieś podkreślnik pisak o odległość otwórz nawias okrągły długość podkreślnik linii asterysk wycięcie zamknij nawias okrągły. Linia 10. zbiór podkreślnik cantora otwórz nawias okrągły nowa podkreślnik długość przecinek wycięcie przecinek liczba podkreślnik linii minus 1 zamknij nawias okrągły.

Opierając się na powyższym algorytmie, wykonamy implementację w języku Python. W tym celu wykorzystamy moduł turtle:

Linia 1. def zbior podkreślnik cantora otwórz nawias okrągły z przecinek dlugosc podkreślnik linii przecinek wyciecie przecinek liczba podkreślnik linii zamknij nawias okrągły dwukropek. Linia 2. if liczba podkreślnik linii znak równości znak równości 0 dwukropek. Linia 3. z kropka pd otwórz nawias okrągły zamknij nawias okrągły. Linia 4. z kropka fd otwórz nawias okrągły dlugosc podkreślnik linii zamknij nawias okrągły. Linia 5. z kropka pu otwórz nawias okrągły zamknij nawias okrągły. Linia 6. else dwukropek. Linia 7. nowa podkreślnik dlugosc znak równości dlugosc podkreślnik linii asterysk otwórz nawias okrągły 1 minus wyciecie zamknij nawias okrągły prawy ukośnik 2. Linia 8. zbior podkreślnik cantora otwórz nawias okrągły z przecinek nowa podkreślnik dlugosc przecinek wyciecie przecinek liczba podkreślnik linii minus 1 zamknij nawias okrągły. Linia 9. z kropka fd otwórz nawias okrągły dlugosc podkreślnik linii asterysk wyciecie zamknij nawias okrągły. Linia 10. zbior podkreślnik cantora otwórz nawias okrągły z przecinek nowa podkreślnik dlugosc przecinek wyciecie przecinek liczba podkreślnik linii minus 1 zamknij nawias okrągły.

Powyższy kod nie spowoduje jednak wyrysowania fraktala – brakuje w nim poleceń, które wywołałyby rysowanie na różnych poziomach. Musimy zatem napisać dodatkową funkcję, która pomoże w tworzeniu obrazu:

Linia 1. def fraktal podkreślnik cantora otwórz nawias okrągły z przecinek dlugosc podkreślnik lini przecinek ile zamknij nawias okrągły dwukropek. Linia 2. for i in range otwórz nawias okrągły ile zamknij nawias okrągły dwukropek. Linia 3. zbior podkreślnik cantora otwórz nawias okrągły z przecinek dlugosc podkreślnik lini przecinek 1 prawy ukośnik 3 przecinek i zamknij nawias okrągły. Linia 4. z kropka back otwórz nawias okrągły dlugosc podkreślnik lini zamknij nawias okrągły. Linia 5. z kropka lt otwórz nawias okrągły 90 zamknij nawias okrągły. Linia 6. z kropka back otwórz nawias okrągły 100 prawy ukośnik ile minus 1 zamknij nawias okrągły. Linia 7. z kropka rt otwórz nawias okrągły 90 zamknij nawias okrągły.

Kod niezbędny do wyrysowania fraktala i wygenerowania obrazu to:

Linia 1. kratka poniższe wiersze niezbędne są dla wykonania. Linia 2. from turtle import Turtle. Linia 3. zlw znak równości Turtle otwórz nawias okrągły zamknij nawias okrągły. Linia 5. kratka wykonaj obraz. Linia 6. fraktal podkreślnik cantora otwórz nawias okrągły zlw przecinek 300 przecinek 5 zamknij nawias okrągły.
RiYi70fnyGR2o1
Zbiór Cantora – efekt po wykonaniu kilku pierwszych kroków
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

Algorytm opisowy do generowania płatka Kocha

Płatek Kocha powstaje w wyniku podziału odcinka na trzy części i usunięcia środkowej, a w jej miejsce wstawieniu trójkąta równobocznego o boku długości usuniętego odcinka. Taki algorytm stosujemy dla każdego fragmentu odcinka bazowego, a następnie dla każdego fragmentu każdego kolejnego pododcinka – i tak dalej. Taka figura może mieć nieskończoną długość, gdyż każdy podział tworzy cztery razy więcej odcinków niż poprzedni.

1
Przykład 3

Spróbujmy zdefiniować algorytm tworzenia geometrycznej prezentacji:

Linia 1. platek podkreślnik kocha otwórz nawias okrągły stopien przecinek dl podkreślnik bok zamknij nawias okrągły. Linia 3. bok otwórz nawias okrągły stopien przecinek dl podkreślnik bok zamknij nawias okrągły. Linia 4. jeśli stopien wynosi 0 narysuj podkreślnik odcinek podkreślnik dlugosci dl podkreślnik bok. Linia 5. w innym przypadku. Linia 6. bok otwórz nawias okrągły stopien minus 1 przecinek dl podkreślnik bok prawy ukośnik 3 zamknij nawias okrągły. Linia 7. obróć żółwia w lewo o 60 stopni. Linia 8. bok otwórz nawias okrągły stopien minus 1 przecinek dl podkreślnik bok prawy ukośnik 3 zamknij nawias okrągły. Linia 9. obróć żółwia w prawo o 120 stopni. Linia 10. bok otwórz nawias okrągły stopien minus 1 przecinek dl podkreślnik bok prawy ukośnik 3 zamknij nawias okrągły. Linia 11. obróć żółwia w lewo o 60 stopni. Linia 12. bok otwórz nawias okrągły stopien minus 1 przecinek dl podkreślnik bok prawy ukośnik 3 zamknij nawias okrągły. Linia 14. obróć żółwia w prawo o 30 stopni. Linia 15. powtórz 3 razy. Linia 16. bok otwórz nawias okrągły stopien przecinek dl podkreślnik bok zamknij nawias okrągły. Linia 17. obróć żółwia w prawo o 120 stopni. Linia 19. obróć żółwia w lewo o 30 stopni.

Na podstawie takiego opisu zapiszemy kod funkcji:

Linia 1. def platek podkreślnik kocha otwórz nawias okrągły z przecinek stopien przecinek dl podkreślnik bok zamknij nawias okrągły dwukropek. Linia 3. def bok otwórz nawias okrągły stopien przecinek dl podkreślnik bok zamknij nawias okrągły dwukropek. Linia 4. if stopien znak równości znak równości 0 dwukropek. Linia 5. z kropka forward otwórz nawias okrągły dl podkreślnik bok zamknij nawias okrągły. Linia 6. else dwukropek. Linia 7. bok otwórz nawias okrągły stopien minus 1 przecinek dl podkreślnik bok prawy ukośnik 3 zamknij nawias okrągły. Linia 8. z kropka left otwórz nawias okrągły 60 zamknij nawias okrągły. Linia 9. bok otwórz nawias okrągły stopien minus 1 przecinek dl podkreślnik bok prawy ukośnik 3 zamknij nawias okrągły. Linia 10. z kropka right otwórz nawias okrągły 120 zamknij nawias okrągły. Linia 11. bok otwórz nawias okrągły stopien minus 1 przecinek dl podkreślnik bok prawy ukośnik 3 zamknij nawias okrągły. Linia 12. z kropka left otwórz nawias okrągły 60 zamknij nawias okrągły. Linia 13. bok otwórz nawias okrągły stopien minus 1 przecinek dl podkreślnik bok prawy ukośnik 3 zamknij nawias okrągły. Linia 15. z kropka right otwórz nawias okrągły 30 zamknij nawias okrągły. Linia 16. for i in range otwórz nawias okrągły 3 zamknij nawias okrągły dwukropek. Linia 17. bok otwórz nawias okrągły stopien przecinek dl podkreślnik bok zamknij nawias okrągły. Linia 18. z kropka right otwórz nawias okrągły 120 zamknij nawias okrągły. Linia 20. z kropka left otwórz nawias okrągły 30 zamknij nawias okrągły.

A oto efekt wykonania algorytmu:

Linia 1. kratka poniższe wiersze niezbędne są dla wykonania. Linia 2. from turtle import Turtle. Linia 3. zlw znak równości Turtle otwórz nawias okrągły zamknij nawias okrągły. Linia 5. platek podkreślnik kocha otwórz nawias okrągły zlw przecinek 3 przecinek 200 zamknij nawias okrągły.
R1Ap30iRUGOu5
Płatek Kocha – efekt po wykonaniu kilku pierwszych kroków
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

Algorytm opisowy do generowania drzewa binarnego

Drzewo binarne to odcinek, który dzieli się na dwa kolejne, każdy rysowany pod kątem 45 stopni w lewo i 45 stopni w prawo. W ten sposób powstaje swego rodzaju „korona drzewa”. W kolejnym module tego e‑materiału znajdziesz prezentację multimedialną, dzięki której dokładnie prześledzisz proces powstawania tego fraktala.

1
Przykład 4

Spróbujmy zdefiniować algorytm tworzenia geometrycznej prezentacji:

Linia 1. drzewo podkreślnik binarne otwórz nawias okrągły stopien przecinek dlugosc podkreślnik pnia zamknij nawias okrągły. Linia 2. jesli stopien wynosi 0 to. Linia 3. narysuj pień o długości dlugosc podkreślnik pnia. Linia 4. wróć do punktu początkowego. Linia 5. zakończ. Linia 6. w innym przypadku. Linia 7. narysuj pień o długości dlugosc podkreślnik pnia. Linia 8. obróć żółwia w lewo o 45 stopni. Linia 9. drzewo podkreślnik binarne otwórz nawias okrągły stopien minus 1 przecinek dlugosc podkreślnik pnia prawy ukośnik 2 zamknij nawias okrągły. Linia 10. obróć żółwia w prawo o 90 stopni. Linia 11. drzewo podkreślnik binarne otwórz nawias okrągły stopien minus 1 przecinek dlugosc podkreślnik pnia prawy ukośnik 2 zamknij nawias okrągły. Linia 12. obróć żółwia w lewo o 45 stopni. Linia 13. cofnij żółwia o dlugosc podkreślnik pnia.

Na podstawie powyższego opisu zapiszemy kod funkcji:

Linia 1. def drzewo podkreślnik binarne otwórz nawias okrągły z przecinek stopien przecinek dl podkreślnik bok zamknij nawias okrągły dwukropek. Linia 2. if stopien znak równości znak równości 0 dwukropek. Linia 3. pozycja znak równości z kropka pos otwórz nawias okrągły zamknij nawias okrągły. Linia 4. z kropka forward otwórz nawias okrągły dl podkreślnik bok zamknij nawias okrągły. Linia 5. z kropka goto otwórz nawias okrągły pozycja zamknij nawias okrągły. Linia 6. else dwukropek. Linia 7. pozycja znak równości z kropka pos otwórz nawias okrągły zamknij nawias okrągły. Linia 8. z kropka forward otwórz nawias okrągły dl podkreślnik bok zamknij nawias okrągły. Linia 9. z kropka left otwórz nawias okrągły 45 zamknij nawias okrągły. Linia 10. drzewo podkreślnik binarne otwórz nawias okrągły z przecinek stopien minus 1 przecinek dl podkreślnik bok prawy ukośnik 2 zamknij nawias okrągły. Linia 11. z kropka right otwórz nawias okrągły 90 zamknij nawias okrągły. Linia 12. drzewo podkreślnik binarne otwórz nawias okrągły z przecinek stopien minus 1 przecinek dl podkreślnik bok prawy ukośnik 2 zamknij nawias okrągły. Linia 13. z kropka left otwórz nawias okrągły 45 zamknij nawias okrągły. Linia 14. z kropka goto otwórz nawias okrągły pozycja zamknij nawias okrągły.

Efekt wykonania algorytmu wygląda następująco:

Linia 1. kratka poniższe wiersze niezbędne są dla wykonania. Linia 2. from turtle import Turtle. Linia 3. zlw znak równości Turtle otwórz nawias okrągły zamknij nawias okrągły. Linia 5. kratka przenosimy żółwia w konkretne miejsce układu współrzędnych. Linia 6. kratka aby narysowany obraz dobrze mieścił się w oknie. Linia 7. zlw kropka penup otwórz nawias okrągły zamknij nawias okrągły. Linia 8. zlw kropka goto otwórz nawias okrągły minus 20 przecinek minus 20 zamknij nawias okrągły. Linia 9. zlw kropka pendown otwórz nawias okrągły zamknij nawias okrągły. Linia 10. zlw kropka left otwórz nawias okrągły 90 zamknij nawias okrągły. Linia 12. drzewo podkreślnik binarne otwórz nawias okrągły zlw przecinek 3 przecinek 50 zamknij nawias okrągły.
RrBjln6KuCTGg
Drzewo binarne - efekt po wykonaniu kilku pierwszych kroków
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.
Już wiesz

Podsumujmy najważniejsze elementy tego e‑materiału.

  • Fraktale to figury geometrycznie nieskończenie samopodobne.

  • Możemy przygotować funkcje rekurencyjne i wizualizować je za pomocą modułu turtle.

  • Obiekt żółwia przy funkcjach rekurencyjnych musimy tworzyć poza przestrzenią nazwprzestrzeń nazwprzestrzenią nazw funkcji.

Słownik

fraktal
fraktal

(łac. fractus – złamany, cząstkowy, ułamkowy) obiekt składający się z coraz bardziej złożonych detali, z których każdy jest podobny do całości

przestrzeń nazw
przestrzeń nazw

(ang. namespace) miejsce w pamięci operacyjnej, w której jest przechowywana dana zmienna; najczęściej przestrzeń nazw wiąże się z funkcją, a zmienne używane w niej są widoczne tylko w obrębie tej przestrzeni – jest to „zakres obowiązywania” tych zmiennych

rekurencja
rekurencja

proces polegający na wywoływaniu funkcji przez siebie samą do momentu rozwiązania określonego zadania

turtle
turtle

(z ang. żółw) moduł (standardowa biblioteka) w języku Python realizujący grafikę żółwia