3.4 Zakręt za zakrętem
str. 81
Cele:
- wiem, czym jest rekurencja,
- potrafię tworzyć skrypty rekurencyjne.
Rekurencja umożliwia łatwe rozwiązywanie trudnych zadań. Będziesz z niej korzystać wielokrotnie. Teraz zapoznasz się z działaniem pierwszego skryptu rekurencyjnego.
CO TO JEST REKURENCJA?
Spróbuj wytłumaczyć, jak wykonywać jakąś czynność wymagającą wielu powtórzeń, np. jak tańczyć tango. Dwa długie wolne kroki, dwa krótkie szybkie kroki. Potem cały proces się powtarza. Na tym właśnie polega rekurencja. To sposób opisywania powtarzających się czynności. W gruncie rzeczy można powiedzieć, że cały świat jest w pewnej mierze rekurencyjny – zmywanie naczyń, jedzenie zupy, przechodzenie po pasach przez ulicę, zbieranie rozsypanych kartek… Nie zawsze łatwo da się określić, ile razy powtórzyć polecenia. Opisujesz więc pewną procedurę, nie kończąc jej definiowania. Stosujesz procedury wywołujące same siebie.
RYSOWANIE GWIAZD
Figura przedstawiona na rys. 2 powstała wskutek wielokrotnego wykonania bloków przesuń o 200 kroków i obróć w prawo o 156 stopni
. Ile razy? Dostatecznie wiele. Można pracowicie policzyć, ile potrzeba skrętów, aby uzyskać pełną gwiazdę, ale wygodniej jest zostawić tę część pracy komputerowi.
Najprostszy plan rysowania gwiazdy, zapisany za pomocą języka naturalnego, wygląda następująco:
- przejście naprzód o długość boku,
- skręt w prawo o wartość kąta,
- powtórzenie tych samych czynności dostatecznie wiele razy.
Zrealizuj ten plan w Scratchu.
- Utwórz nowy blok o nazwie
wielo
, kliknij przycisk Dodaj dane wejściowe liczba lub tekst i dodaj dwa parametry liczbowe –bok
ikąt
. - Utwórz skrypt, który po naciśnięciu klawisza
w
będzie odpowiadać za rysowanie – dodaj grupę bloków Pióro i przed wywołaniem blokuwielo
wstaw blokiwyczyść wszystko
(w ten sposób przy każdym uruchomieniu programu duszek będzie rysować w pustym oknie) orazPrzyłóż pisak
. Jeśli chcesz, rozszerz skrypt o ustawienie właściwości pisaka.
JAK ZATRZYMAĆ REKURENCJĘ?
Istnieje pewne ryzyko stosowania rekurencji: jeśli nie zostanie określony warunek zakończenia działania, to będzie ona działać w nieskończoność. W przypadku tańca warunek jest prosty: należy skończyć, gdy przestanie grać muzyka. Blok wielo
nie ma określonego warunku zatrzymania – trzeba go zatem wstawić. Niech duszek kończy rysowanie po naciśnięciu lewego przycisku myszy.
- Dodaj do skryptu blok
jeżeli (…) to (…)
opisujący następującą sytuację: jeśli zostanie naciśnięty lewy przycisk myszy, to należy zatrzymać wykonywanie skryptu. Umieść go tuż po nagłówku bloku. - Przetestuj działanie skryptu – czy duszek zatrzymał się po naciśnięciu lewego przycisku myszy?
- Czy potrafisz zaplanować takie kąty skrętu, dla których powstaną ładne gwiazdy? Narysuj kilka gwiazd, żeby wypróbować różne kąty skrętu. Podaj również kąt 90 stopni. Co zostanie narysowane?
JAK ZMIENIĆ REKURENCJĘ?
Rekurencję można oczywiście zmodyfikować – wystarczy zmienić wartości parametrów w bloku rekurencyjnym.
- Zmień wartość parametrów w wywołaniu rekurencyjnym bloku
wielo
– niechbok
zwiększa się o5
, akąt
maleje o1
. - warunek zakończenia: „aż do zetknięcia z krawędzią”,
- kroki do wykonania powtarzane rekurencyjnie: narysowanie boku i wykonanie skrętu o podany kąt.
- Utwórz rekurencyjny blok
wielospi
z parametramibok
,kąt
. - Utwórz skrypt działający po naciśnięciu klawisza spacji – oprócz bloków odpowiadających za rysowanie i wywołania bloku rekurencyjnego dodaj bloki
Idź do x: (…) y: (…) i ustaw kierunek na (…)
, tak aby duszek zaczynał rysowanie w tym samym punkcie okna i tak samo ustawiony. Wybierz parametry wywołania: bok5
, kąt90
. - Zwolnij działanie duszka, aby przyjrzeć się jego kolejnym ruchom – dodaj przed wywołaniem rekurencyjnym w bloku
wielospi
blokczekaj 0.5 sekund
. - Umieść blok
czekaj
za wywołaniem rekurencyjnym – tym razem duszek znów rysuje bardzo szybko, ale ma kłopoty z zakończeniem działania. Czy to możliwe, że blok dodany po wywołaniu rekurencyjnym zostanie wykonany? - Przestaw blok
czekaj
na właściwe miejsce i dodaj za nim blokzmień rozmiar o 5
. Jak teraz wykonywany jest skrypt? Jak powiększył się duszek? - Wywołuj blok
wielospi
dla różnych kątów.
Skoro za pomocą bloku wielo
można narysować kwadrat, to może uda się utworzyć również figurę przedstawioną na rys. 7?
Ponieważ w tym wypadku długość boku się zmienia, trzeba wprowadzić pewne zmiany w bloku. Rysowanie należy zacząć od najkrótszego boku, np. o długości 5. Następny bok, rysowany po skręcie, powinien być o 5 dłuższy od poprzedniego i tak dalej, aż do narysowania najdłuższego boku, który dotknie krawędzi. Są tu elementy charakterystyczne dla budowy skryptu rekurencyjnego:
Skąd jednak skrypt będzie wiedział, że ma narysować kolejny bok dłuższy od poprzedniego? To proste – blok rysuje bok, którego wartość podaje się w jego wywołaniu. Jeśli przy każdym kolejnym wywołaniu bok ma być dłuższy o 5 od poprzedniego, to należy zwiększać długość boku w wywołaniu rekurencyjnym.
W projekcie znajdującym się pod adresem https://scratch.mit.edu/projects/342957512 możesz obejrzeć wiele różnych figur tworzonych przez blok wielospi
.
Brak komentarzy:
Prześlij komentarz