260 likes | 370 Views
Recursie. Steve Dewanckele http://studwww.ugent.be/~sdwancke/ailo/. Recursie (1). Wat doet de volgende procedure? to vierkant repeat 4 [fd 100 rt 90] vierkant end Opl.: Tekent oneindig aantal keer dezelfde vierkant doordat de procedure vierkant telkens naar zichzelf verwijst.
E N D
Recursie Steve Dewanckele http://studwww.ugent.be/~sdwancke/ailo/
Recursie (1) • Wat doet de volgende procedure? to vierkant repeat 4 [fd 100 rt 90] vierkant end • Opl.: Tekent oneindig aantal keer dezelfde vierkant doordat de procedure vierkant telkens naar zichzelf verwijst.
Recursie (2) • Recursie is een proces dat verwijst naar zichzelf. • Logo heeft procedures die zichzelf aanroepen terwijl ze zichzelf aanroepen • Vgl: procedure vierkant roept zichzelf aan terwijl procedure vierkant zichzelf (als procedure vierkant) aanroept
Recursie (3) • Procedure vierkant wordt oneindig aantal keer aangeroepen. Hoe kan dit proces dan gestopt worden? • De HALT-toets drukken • De computer te resetten • De computer afzetten • Stoppen met conditie
Recursie (4) • Stoppen met conditie to vierkant :STAP if :STAP > 150 [stop] repeat 4 [fd :STAP rt 90] vierkant :STAP + 5 end • Stoppen met een toetsdruk (KEYP) if keyp [stop]
Recursie (5) • Komt de procedureoproep telkens op het einde van de procedure? • Neen. Kan zowel: • Begin • Midden • Einde
Recursie (6) • Verschil tussen: to cirkel :STRAAL if :STRAAL = 0 [stop] circle :STRAAL cirkel :STRAAL - 1 end to cirkel :STRAAL if :STRAAL = 0 [stop] cirkel :STRAAL - 1 circle :STRAAL end
Oefening op recursie Vlieger
Opgave (3) • KORTEZIJDE: sqrt(2) * :X • LANGEZIJDE: sqrt((:X * :X) * (STAART * STAART)) • HOEK: • ARCTAN (:X / :STAART) • ARCCOS (:STAART / :LANGEZIJDE) • ARCSIN (:X / :LANGEZIJDE) http://studwww.ugent.be/~sdwancke/ailo/
Opgave (4) • Oplossing to boven :X local "KORTEZIJDE make "KORTEZIJDE (sqrt 2) * :X fd :KORTEZIJDE rt 90 fd :KORTEZIJDE end
Opgave (5) • Oplossing to onder :X :STAART local "LANGEZIJDE local "HOEK make "LANGEZIJDE sqrt ((:X * :X) + (:STAART * :STAART)) make "HOEK ARCTAN (:X / :STAART) rt (45 + :HOEK) fd :LANGEZIJDE rt (180 - 2 * :HOEK) fd :LANGEZIJDE rt :HOEK end
Opgave (6) • Oplossing to vlieger :X :STAART :AANTAL local "STAP make " STAP :X / :AANTAL cs rt 45 omtrek :X :STAART lt 45 kader :X :STAART end if (modulo :X :AANTAL) > 0 [pr [Aantal moet een deler zijn van de vliegerbreedte] stop]
Opgave (7) • Oplossing to omtrek :X :STAART boven :X onder :X :STAART pu rt 90 setpc random 500 fd :STAP lt 45 pd if :X = :STAP [stop] omtrek :X - :STAP :STAART end
Maansverduistering (1) • Wat is dat? • De aarde komt voor de zon te staan waarbij de maan geen (of nauwelijks) zonlicht krijgt
Opgave (1) • Tekenen van de maansverduistering waarbij de straal van de maan wordt opgegeven • Extra: tekenen van omgeving met sterren
Opgave (2) • Hoe te werk gaan: • Teken de maan in wit ([255 255 255]) • Teken de aarde (of schaduw) waarbij kleur hetzelfde is als de achtergrondkleur ([0 0 0]) • Startpunt (xcor) zon is 2*STRAAL naar links • Zon komt over aarde totdat xcor zon = 0 • Procedures • to maan :STRAAL • to schaduw :STRAAL • to maansverduistering :STRAAL
Opgave (3) • Oplossing: to maan :STRAAL pd circle :STRAAL if :STRAAL > 0 [maan :STRAAL - 1] end to schaduw :STRAAL circle :STRAAL setx xcor + 1 if xcor = 0 [stop] schaduw :STRAAL end
Opgave (4) to maansverduistering :STRAAL if :STRAAL < 6 [pr [Straal is te klein] stop] if :STRAAL > 100 [pr [Straal is te groot] stop] cs cleartext ht zetomgeving :STRAAL pr [Bezig met maan aan het tekenen...] maan :STRAAL pu setpc [0 0 0] setx -(2 * :STRAAL) pd cleartext pr [Hier komt de aarde...] schaduw :STRAAL home setpc [255 127 127] maan :STRAAL pr [Het is een maansverduistering !!] end
Lijst van nieuwe commando’s • Random getal • Genereren van een willekeurg getal tussen 0 en getal-1 • Cleartext • Schoonmaken van het tekstveld (onderaan bij de commandolijn) • Wiskundige berekeningen • ARCCOS hoek • ARCSIN hoek • ARCTAN hoek
Extra oef (1) • Gebruik recursie voor het maken van:
Extra oef (2) • Oplossing to blokken :HOOGTE :BREEDTE rechthoek :HOOGTE :BREEDTE if (:HOOGTE > 10) [blokken :HOOGTE - 10 :BREEDTE + 10] end to rechthoek :HOOGTE :BREEDTE repeat 2 [fd :HOOGTE rt 90 fd :BREEDTE rt 90] end
Recursie + oefeningen Nog vragen?