{"id":198,"date":"2019-01-09T14:38:18","date_gmt":"2019-01-09T14:38:18","guid":{"rendered":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/?post_type=chapter&#038;p=198"},"modified":"2019-08-30T06:47:33","modified_gmt":"2019-08-30T06:47:33","slug":"silmaring-rekursioon","status":"publish","type":"chapter","link":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/chapter\/silmaring-rekursioon\/","title":{"raw":"Silmaring: Rekursioon","rendered":"Silmaring: Rekursioon"},"content":{"raw":"Reeglina rekursiooni algkursusel ei k\u00e4sitleta, siingi on see silmaringi materjalide hulgas. Kuna tegemist on niiv\u00f5rd kena ja p\u00f5neva teemaga, siis ei sobi j\u00e4tta huvilisi nendest teadmistest ilma. Ei maksa nukrutseda, kui mingid kohad selles osas liiga keerulised tunduvad. J\u00e4ta need julgesti vahele!\r\n<h2>Rekursioon<\/h2>\r\n<p class=\"vspace\">Tegelikult saab funktsiooni v\u00e4lja kutsuda ka selle sama funktsiooni sisemuses. Esialgu v\u00f5ib see tunduda v\u00f5\u00f5ras - kuidas siis saab nii olla, et me justkui \u00f5petaksime mingit uut asja tegema sellesama asja abil, mida praegu \u00f5petame?! Tegemist on <strong>rekursiooniga<\/strong> - arvutiteaduse \u00fche alusm\u00f5istega.<\/p>\r\n<p class=\"vspace\">Rekursioon sobib eriti h\u00e4sti selliste \u00fclesannete lahendamiseks, kus tervik\u00fclesanne koosneb mingis m\u00f5ttes sarnastest, kuid v\u00e4iksematest alam\u00fclesannetest. Kui p\u00f5hi\u00fclesannet piisavalt kaua alam\u00fclesanneteks jagades muutuvad alam\u00fclesanded nii v\u00e4ikeseks, et v\u00e4iksemaks minna enam ei saa v\u00f5i ei taha, siis v\u00f5iks p\u00fc\u00fcda seda protsessi rekursiivselt esitada.<\/p>\r\n\r\n<h3>Faktoriaal<\/h3>\r\n<p class=\"vspace\">Klassikaline rekursiooni n\u00e4ide on <a class=\"urllink\" href=\"https:\/\/et.wikipedia.org\/wiki\/Faktoriaal\" target=\"_blank\" rel=\"noopener noreferrer\">faktoriaali<\/a> arvutamine. Positiivse t\u00e4isarvu <em>n<\/em> faktoriaal (t\u00e4histus <em>n!<\/em>) on <em>n<\/em> esimese positiivse t\u00e4isarvu korrutis. N\u00e4iteks 4! = 1 \u00b7 2 \u00b7 3 \u00b7 4 = 24. Eraldi on kokku lepitud, et 0! = 1. Muidugi ka 1! = 1. Rekursiivsena saab faktoriaali leidmist kirjeldada nii, et iga j\u00e4rgmise arvu faktoriaali saame esitada eelmise arvu faktoriaali abil. N\u00e4iteks 4! = 4 \u00b7 3! ja omakorda 3! = 3 \u00b7 2! ning 2! = 2 \u00b7 1!. \u00dcldistatult saame kaks haru:<\/p>\r\n\r\n<ul>\r\n \t<li>n! = 1, kui n = 0<\/li>\r\n \t<li>n! = n \u00b7 (n-1)!, kui n &gt; 0<\/li>\r\n<\/ul>\r\n<p class=\"vspace\">Faktoriaali leidmise programm oleks selline:<\/p>\r\n<strong>N\u00e4iteprogramm. Faktoriaal<\/strong>\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">def faktoriaal(n):\r\n    if n == 0:             # Rekursiooni baas\r\n        return 1\r\n    else:                  # Rekursiooni samm\r\n        return n * faktoriaal(n-1)\r\n \r\nprint(faktoriaal(4))\r\nprint(faktoriaal(0))\r\nprint(faktoriaal(400))<\/pre>\r\n<p class=\"vspace\">Rekursiivsetes programmides on alati mitu haru. Selleks, et protsess \u00fcldse kunagi l\u00f5ppeks, peab v\u00e4hemalt \u00fcks haru olema ilma rekursiivse v\u00e4ljakutseta. Seda haru nimetatakse <strong>rekursiooni baasiks<\/strong>. Rekursiivse v\u00e4ljakutsega (st sellesama funktsiooni v\u00e4ljakutsumisega) haru nimetatakse <strong>rekursiooni sammuks<\/strong>.<\/p>\r\n<p class=\"vspace\">Rekursiooniga on seotud mitmed elulised teemad, n\u00e4iteks k\u00fc\u00fclikute paljunemise modelleerimine Fibonacci arvude abil jpm. Meie l\u00e4heme aga visuaalsemate teemade juurde - hakkame vaatlema puid.<\/p>\r\n\r\n<h3>Korrap\u00e4rane puu<\/h3>\r\nOlgu meie eesm\u00e4rgiks saada selline puu:\r\n\r\n<img class=\"alignnone size-medium wp-image-199\" src=\"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-content\/uploads\/sites\/6\/2019\/01\/puu100-300x266.png\" alt=\"\" width=\"300\" height=\"266\" \/>\r\n<p class=\"vspace\">Terasel vaatlemisel m\u00e4rkame, et puu iga haru on ise omakorda samasugune puu, aga v\u00e4iksem. Tolle v\u00e4iksema puu iga haru on j\u00e4llegi veel v\u00e4iksem puu. Selliseid kujundeid, kus osa on terviku sarnane, nimetatakse <strong>fraktaliteks<\/strong>.<\/p>\r\n<p class=\"vspace\">Teoreetiliselt v\u00f5ime l\u00f5pmatult joonistada puule v\u00e4iksemaid oksi, aga praktiliselt poleks sel m\u00f5tet ja piiri seadmiseks v\u00f5tame appi rekursiooni baasi. N\u00e4iteprogrammis j\u00f5uame rekursiooni baasini, kui j\u00e4rjekordse puu \"t\u00fcve\" pikkus on v\u00e4iksem kui 5. Sellisel juhul joonistamegi ainult t\u00fcve, milleks liigume vastava arvu samme edasi ja seej\u00e4rel kohe tagasi.<\/p>\r\n<p class=\"vspace\">Rekursiooni sammu puhul aga joonistame t\u00fcve ja kaks haru, mis on omakorda ka puud, aga v\u00e4iksemad (korrutame teguriga 0,6). Harude joonistamise eel, vahel ja j\u00e4rel tuleb kilpkonna ka sobivalt p\u00f6\u00f6rata.<\/p>\r\n<p class=\"vspace\">K\u00e4ivita see programm. N\u00e4ed ka, kui kaua kilpkonnal see joonistamine aega v\u00f5tab. Selleks, et joonis kiiremini tekiks, v\u00f5ib kasutada funktsioone <code><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">delay(0)<\/code><\/code> ja <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">speed(10)<\/code>.<\/p>\r\n<strong>N\u00e4iteprogramm. Rekursiivne puu<\/strong>\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">from turtle import *\r\n \r\ndef puu(pikkus):          \r\n    if pikkus &lt; 5:         # Rekursiooni baas\r\n        forward(pikkus)    # Ainult t\u00fcvi\r\n        back(pikkus)\r\n    else:                  # Rekursiooni samm\r\n        forward(pikkus)    # T\u00fcvi\r\n        left(45)\r\n        puu(0.6 * pikkus)  # Haru, mis on v\u00e4iksem puu\r\n        right(90)\r\n        puu(0.6 * pikkus)  # Teine haru, mis on ka v\u00e4iksem puu\r\n        left(45)\r\n        back(pikkus)       # T\u00fcvepidi tagasi\r\n \r\ndelay(0)\r\nspeed(10)       \r\nleft(90)\r\npuu(100)\r\n \r\nexitonclick()<\/pre>\r\n<h3>Loobume s\u00fcmmeetriast<\/h3>\r\nEelmine puu oli meil v\u00e4ga korrap\u00e4rane ja s\u00fcmmeetriline. Loobume sellest, et puu peaks s\u00fcmmeetriline olema. Muudame programmi nii, et enam ei p\u00f6\u00f6rataks 45 kraadi vasakule, 90 paremale ja 45 vasakule. Olgu n\u00e4iteks vasakule p\u00f6\u00f6rded 40 ja 50 kraadi.\r\n\r\n<strong>N\u00e4iteprogramm. As\u00fcmmeetriline puu<\/strong>\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">from turtle import *\r\n \r\ndef puu(pikkus):\r\n    if pikkus &lt; 5:\r\n        forward(pikkus)    \r\n        back(pikkus)\r\n    else:\r\n        forward(pikkus)\r\n        left(40)           # P\u00f6\u00f6rame n\u00fc\u00fcd hoopis 40 kraadi\r\n        puu(0.6 * pikkus)\r\n        right(90)\r\n        puu(0.6 * pikkus)\r\n        left(50)           # ja siin 50 kraadi\r\n        back(pikkus)\r\n \r\ndelay(0)\r\nspeed(10)\r\nleft(90)\r\npuu(100)\r\n \r\nexitonclick()<\/pre>\r\n<p class=\"vspace\">N\u00e4eme, et puu on t\u00f5esti natuke ebas\u00fcmmeetriline:<\/p>\r\n<img class=\"alignnone size-full wp-image-200\" src=\"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-content\/uploads\/sites\/6\/2019\/01\/puu4050.png\" alt=\"\" width=\"280\" height=\"266\" \/>\r\n\r\nP\u00e4ris puudel muidugi k\u00f5ik harud \u00fchepikkused pole. Proovime teha nii, et \u00fches harus oleks tegur endiselt 0,6 aga teisel hoopis 0,5.\r\n\r\n<strong>N\u00e4iteprogramm. Erineva harupikkustega puu<\/strong>\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">from turtle import * \r\n \r\ndef puu(pikkus):\r\n    if pikkus &lt; 5:\r\n        forward(pikkus)\r\n        back(pikkus)\r\n    else:\r\n        forward(pikkus)\r\n        left(40)          \r\n        puu(0.6 * pikkus)  # Tegur endiselt 0.6\r\n        right(90)\r\n        puu(0.5 * pikkus)  # Tegur on n\u00fc\u00fcd 0.5\r\n        left(50)\r\n        back(pikkus)\r\n \r\ndelay(0)\r\nspeed(10)\r\nleft(90)\r\npuu(100)\r\n \r\nexitonclick()<\/pre>\r\nSaame midagi sellist:\r\n\r\n<img class=\"alignnone size-full wp-image-201\" src=\"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-content\/uploads\/sites\/6\/2019\/01\/puu06054050.png\" alt=\"\" width=\"234\" height=\"258\" \/>\r\n<h3>Juhuslik puu<\/h3>\r\nV\u00e4ga p\u00f5nevaid v\u00f5imalusi annab juhuslike arvude kasutamine. Nii annab sama programm igal k\u00e4ivitamisel erinevaid tulemusi. Muudame programmi nii, et iga haru joonistamisel m\u00e4\u00e4ratakse tegur, millega pikkus korrutatakse, juhuslikult. Funktsiooniga <code><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">randint(6,7)<\/code><\/code> saame juhusliku arvu 6 v\u00f5i 7. Selleks, et saada 0,6 v\u00f5i 0,7 jagame arvuga 10.\r\n\r\n<strong>N\u00e4iteprogramm. Juhusliku harupikkusega puu<\/strong>\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">from turtle import * \r\nfrom random import *      # Juhuslike arvude moodul\r\n \r\ndef puu(pikkus):\r\n    if pikkus &lt; 5:\r\n        forward(pikkus)\r\n        back(pikkus)\r\n    else:\r\n        forward(pikkus)\r\n        left(40)\r\n        puu(randint(6,7) \/ 10 * pikkus)   # Tegur on 0.6 v\u00f5i 0.7\r\n        right(90)\r\n        puu(randint(6,7) \/ 10 * pikkus)   # Tegur on 0.6 v\u00f5i 0.7\r\n        left(50)\r\n        back(pikkus)\r\n \r\ndelay(0)\r\nspeed(10)\r\nleft(90)\r\npuu(100)\r\n\r\nexitonclick()<\/pre>\r\nTulemus v\u00f5ib olla midagi sarnast:\r\n\r\n<img class=\"alignnone size-medium wp-image-202\" src=\"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-content\/uploads\/sites\/6\/2019\/01\/puujuhuslik68-300x247.png\" alt=\"\" width=\"300\" height=\"247\" \/>\r\n<p class=\"vspace\">Teeme n\u00fc\u00fcd programmi, mis paneb mitu juhusliku suurusega puud k\u00f5rvuti.<\/p>\r\n<strong>N\u00e4iteprogramm. Juhuslike puude mets<\/strong>\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">from turtle import * \r\nfrom random import *\r\n \r\ndef puu(pikkus):\r\n    if pikkus &lt; 5:\r\n        forward(pikkus)\r\n        back(pikkus)\r\n    else:\r\n        forward(pikkus)\r\n        left(45)\r\n        puu(randint(6,7) \/ 10 * pikkus)\r\n        right(90)\r\n        puu(randint(6,7) \/ 10 * pikkus)\r\n        left(45)\r\n        back(pikkus)\r\n \r\ndef mets(puudearv):\r\n    i = 0\r\n    left(90)\r\n    while i &lt; puudearv:\r\n \r\n        pendown()\r\n        puu(randint(20,59))        # Juhusliku pikkusega puu\r\n        penup()\r\n        right(90)\r\n        forward(randint(100,149))  # Puude vahe on ka juhuslik\r\n        left(90)\r\n        i = i + 1\r\n \r\ndelay(0)\r\nspeed(10)   \r\nmets(4)\r\n \r\nexitonclick()<\/pre>\r\nAntud juhul tekib nelja puuga mets:\r\n\r\n<img class=\"alignnone size-medium wp-image-203\" src=\"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-content\/uploads\/sites\/6\/2019\/01\/mets4-300x109.png\" alt=\"\" width=\"300\" height=\"109\" \/>\r\n<h3>Korrast kaoseni<\/h3>\r\nKuigi me mitmeid asju muutsime ja lasime isegi juhuslikult arvutada, meenutasid saadud kujundid ikkagi puid. Teeme n\u00fc\u00fcd n\u00e4iliselt suhteliselt v\u00e4ikese muudatuse, nimelt muudame \u00fche p\u00f6\u00f6ramise 45 kraadi asemel 44 kraadiks. T\u00f5en\u00e4oliselt me silmaga nendel nurkadel vahet ei teeks.\r\n\r\n<strong>N\u00e4iteprogramm. Kaootiline puu<\/strong>\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">from turtle import * \r\nfrom random import *\r\n \r\ndef puu(pikkus):\r\n    if pikkus &lt; 5:\r\n        forward(pikkus)\r\n        back(pikkus)\r\n    else:\r\n        forward(pikkus)\r\n        left(44)\r\n        puu(randint(6,7) \/ 10 * pikkus)\r\n        right(90)\r\n        puu(randint(6,7) \/ 10 * pikkus)\r\n        left(45)\r\n        back(pikkus)\r\n \r\ndelay(0)\r\nspeed(10)       \r\nleft(90)   \r\npuu(100)\r\n \r\nexitonclick()<\/pre>\r\nMis juhtub kujundiga?\r\n\r\n<img class=\"alignnone size-full wp-image-204\" src=\"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-content\/uploads\/sites\/6\/2019\/01\/kaos44.png\" alt=\"\" width=\"177\" height=\"249\" \/>\r\n\r\nN\u00e4eme, et puuga enam tegemist pole ning et v\u00e4ike muudatus viis meid hoopis erineva kujundi juurde. Fraktalite puhul kipubki olema nii, et v\u00e4ike muudatus v\u00f5ib olla v\u00e4ga olulise t\u00e4hendusega.","rendered":"<p>Reeglina rekursiooni algkursusel ei k\u00e4sitleta, siingi on see silmaringi materjalide hulgas. Kuna tegemist on niiv\u00f5rd kena ja p\u00f5neva teemaga, siis ei sobi j\u00e4tta huvilisi nendest teadmistest ilma. Ei maksa nukrutseda, kui mingid kohad selles osas liiga keerulised tunduvad. J\u00e4ta need julgesti vahele!<\/p>\n<h2>Rekursioon<\/h2>\n<p class=\"vspace\">Tegelikult saab funktsiooni v\u00e4lja kutsuda ka selle sama funktsiooni sisemuses. Esialgu v\u00f5ib see tunduda v\u00f5\u00f5ras &#8211; kuidas siis saab nii olla, et me justkui \u00f5petaksime mingit uut asja tegema sellesama asja abil, mida praegu \u00f5petame?! Tegemist on <strong>rekursiooniga<\/strong> &#8211; arvutiteaduse \u00fche alusm\u00f5istega.<\/p>\n<p class=\"vspace\">Rekursioon sobib eriti h\u00e4sti selliste \u00fclesannete lahendamiseks, kus tervik\u00fclesanne koosneb mingis m\u00f5ttes sarnastest, kuid v\u00e4iksematest alam\u00fclesannetest. Kui p\u00f5hi\u00fclesannet piisavalt kaua alam\u00fclesanneteks jagades muutuvad alam\u00fclesanded nii v\u00e4ikeseks, et v\u00e4iksemaks minna enam ei saa v\u00f5i ei taha, siis v\u00f5iks p\u00fc\u00fcda seda protsessi rekursiivselt esitada.<\/p>\n<h3>Faktoriaal<\/h3>\n<p class=\"vspace\">Klassikaline rekursiooni n\u00e4ide on <a class=\"urllink\" href=\"https:\/\/et.wikipedia.org\/wiki\/Faktoriaal\" target=\"_blank\" rel=\"noopener noreferrer\">faktoriaali<\/a> arvutamine. Positiivse t\u00e4isarvu <em>n<\/em> faktoriaal (t\u00e4histus <em>n!<\/em>) on <em>n<\/em> esimese positiivse t\u00e4isarvu korrutis. N\u00e4iteks 4! = 1 \u00b7 2 \u00b7 3 \u00b7 4 = 24. Eraldi on kokku lepitud, et 0! = 1. Muidugi ka 1! = 1. Rekursiivsena saab faktoriaali leidmist kirjeldada nii, et iga j\u00e4rgmise arvu faktoriaali saame esitada eelmise arvu faktoriaali abil. N\u00e4iteks 4! = 4 \u00b7 3! ja omakorda 3! = 3 \u00b7 2! ning 2! = 2 \u00b7 1!. \u00dcldistatult saame kaks haru:<\/p>\n<ul>\n<li>n! = 1, kui n = 0<\/li>\n<li>n! = n \u00b7 (n-1)!, kui n &gt; 0<\/li>\n<\/ul>\n<p class=\"vspace\">Faktoriaali leidmise programm oleks selline:<\/p>\n<p><strong>N\u00e4iteprogramm. Faktoriaal<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">def faktoriaal(n):\r\n    if n == 0:             # Rekursiooni baas\r\n        return 1\r\n    else:                  # Rekursiooni samm\r\n        return n * faktoriaal(n-1)\r\n \r\nprint(faktoriaal(4))\r\nprint(faktoriaal(0))\r\nprint(faktoriaal(400))<\/pre>\n<p class=\"vspace\">Rekursiivsetes programmides on alati mitu haru. Selleks, et protsess \u00fcldse kunagi l\u00f5ppeks, peab v\u00e4hemalt \u00fcks haru olema ilma rekursiivse v\u00e4ljakutseta. Seda haru nimetatakse <strong>rekursiooni baasiks<\/strong>. Rekursiivse v\u00e4ljakutsega (st sellesama funktsiooni v\u00e4ljakutsumisega) haru nimetatakse <strong>rekursiooni sammuks<\/strong>.<\/p>\n<p class=\"vspace\">Rekursiooniga on seotud mitmed elulised teemad, n\u00e4iteks k\u00fc\u00fclikute paljunemise modelleerimine Fibonacci arvude abil jpm. Meie l\u00e4heme aga visuaalsemate teemade juurde &#8211; hakkame vaatlema puid.<\/p>\n<h3>Korrap\u00e4rane puu<\/h3>\n<p>Olgu meie eesm\u00e4rgiks saada selline puu:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-199\" src=\"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-content\/uploads\/sites\/6\/2019\/01\/puu100-300x266.png\" alt=\"\" width=\"300\" height=\"266\" srcset=\"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-content\/uploads\/sites\/6\/2019\/01\/puu100-300x266.png 300w, https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-content\/uploads\/sites\/6\/2019\/01\/puu100-65x58.png 65w, https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-content\/uploads\/sites\/6\/2019\/01\/puu100-225x200.png 225w, https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-content\/uploads\/sites\/6\/2019\/01\/puu100.png 301w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/p>\n<p class=\"vspace\">Terasel vaatlemisel m\u00e4rkame, et puu iga haru on ise omakorda samasugune puu, aga v\u00e4iksem. Tolle v\u00e4iksema puu iga haru on j\u00e4llegi veel v\u00e4iksem puu. Selliseid kujundeid, kus osa on terviku sarnane, nimetatakse <strong>fraktaliteks<\/strong>.<\/p>\n<p class=\"vspace\">Teoreetiliselt v\u00f5ime l\u00f5pmatult joonistada puule v\u00e4iksemaid oksi, aga praktiliselt poleks sel m\u00f5tet ja piiri seadmiseks v\u00f5tame appi rekursiooni baasi. N\u00e4iteprogrammis j\u00f5uame rekursiooni baasini, kui j\u00e4rjekordse puu &#8220;t\u00fcve&#8221; pikkus on v\u00e4iksem kui 5. Sellisel juhul joonistamegi ainult t\u00fcve, milleks liigume vastava arvu samme edasi ja seej\u00e4rel kohe tagasi.<\/p>\n<p class=\"vspace\">Rekursiooni sammu puhul aga joonistame t\u00fcve ja kaks haru, mis on omakorda ka puud, aga v\u00e4iksemad (korrutame teguriga 0,6). Harude joonistamise eel, vahel ja j\u00e4rel tuleb kilpkonna ka sobivalt p\u00f6\u00f6rata.<\/p>\n<p class=\"vspace\">K\u00e4ivita see programm. N\u00e4ed ka, kui kaua kilpkonnal see joonistamine aega v\u00f5tab. Selleks, et joonis kiiremini tekiks, v\u00f5ib kasutada funktsioone <code><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">delay(0)<\/code><\/code> ja <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">speed(10)<\/code>.<\/p>\n<p><strong>N\u00e4iteprogramm. Rekursiivne puu<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">from turtle import *\r\n \r\ndef puu(pikkus):          \r\n    if pikkus &lt; 5:         # Rekursiooni baas\r\n        forward(pikkus)    # Ainult t\u00fcvi\r\n        back(pikkus)\r\n    else:                  # Rekursiooni samm\r\n        forward(pikkus)    # T\u00fcvi\r\n        left(45)\r\n        puu(0.6 * pikkus)  # Haru, mis on v\u00e4iksem puu\r\n        right(90)\r\n        puu(0.6 * pikkus)  # Teine haru, mis on ka v\u00e4iksem puu\r\n        left(45)\r\n        back(pikkus)       # T\u00fcvepidi tagasi\r\n \r\ndelay(0)\r\nspeed(10)       \r\nleft(90)\r\npuu(100)\r\n \r\nexitonclick()<\/pre>\n<h3>Loobume s\u00fcmmeetriast<\/h3>\n<p>Eelmine puu oli meil v\u00e4ga korrap\u00e4rane ja s\u00fcmmeetriline. Loobume sellest, et puu peaks s\u00fcmmeetriline olema. Muudame programmi nii, et enam ei p\u00f6\u00f6rataks 45 kraadi vasakule, 90 paremale ja 45 vasakule. Olgu n\u00e4iteks vasakule p\u00f6\u00f6rded 40 ja 50 kraadi.<\/p>\n<p><strong>N\u00e4iteprogramm. As\u00fcmmeetriline puu<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">from turtle import *\r\n \r\ndef puu(pikkus):\r\n    if pikkus &lt; 5:\r\n        forward(pikkus)    \r\n        back(pikkus)\r\n    else:\r\n        forward(pikkus)\r\n        left(40)           # P\u00f6\u00f6rame n\u00fc\u00fcd hoopis 40 kraadi\r\n        puu(0.6 * pikkus)\r\n        right(90)\r\n        puu(0.6 * pikkus)\r\n        left(50)           # ja siin 50 kraadi\r\n        back(pikkus)\r\n \r\ndelay(0)\r\nspeed(10)\r\nleft(90)\r\npuu(100)\r\n \r\nexitonclick()<\/pre>\n<p class=\"vspace\">N\u00e4eme, et puu on t\u00f5esti natuke ebas\u00fcmmeetriline:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-200\" src=\"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-content\/uploads\/sites\/6\/2019\/01\/puu4050.png\" alt=\"\" width=\"280\" height=\"266\" srcset=\"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-content\/uploads\/sites\/6\/2019\/01\/puu4050.png 280w, https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-content\/uploads\/sites\/6\/2019\/01\/puu4050-65x62.png 65w, https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-content\/uploads\/sites\/6\/2019\/01\/puu4050-225x214.png 225w\" sizes=\"auto, (max-width: 280px) 100vw, 280px\" \/><\/p>\n<p>P\u00e4ris puudel muidugi k\u00f5ik harud \u00fchepikkused pole. Proovime teha nii, et \u00fches harus oleks tegur endiselt 0,6 aga teisel hoopis 0,5.<\/p>\n<p><strong>N\u00e4iteprogramm. Erineva harupikkustega puu<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">from turtle import * \r\n \r\ndef puu(pikkus):\r\n    if pikkus &lt; 5:\r\n        forward(pikkus)\r\n        back(pikkus)\r\n    else:\r\n        forward(pikkus)\r\n        left(40)          \r\n        puu(0.6 * pikkus)  # Tegur endiselt 0.6\r\n        right(90)\r\n        puu(0.5 * pikkus)  # Tegur on n\u00fc\u00fcd 0.5\r\n        left(50)\r\n        back(pikkus)\r\n \r\ndelay(0)\r\nspeed(10)\r\nleft(90)\r\npuu(100)\r\n \r\nexitonclick()<\/pre>\n<p>Saame midagi sellist:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-201\" src=\"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-content\/uploads\/sites\/6\/2019\/01\/puu06054050.png\" alt=\"\" width=\"234\" height=\"258\" srcset=\"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-content\/uploads\/sites\/6\/2019\/01\/puu06054050.png 234w, https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-content\/uploads\/sites\/6\/2019\/01\/puu06054050-65x72.png 65w, https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-content\/uploads\/sites\/6\/2019\/01\/puu06054050-225x248.png 225w\" sizes=\"auto, (max-width: 234px) 100vw, 234px\" \/><\/p>\n<h3>Juhuslik puu<\/h3>\n<p>V\u00e4ga p\u00f5nevaid v\u00f5imalusi annab juhuslike arvude kasutamine. Nii annab sama programm igal k\u00e4ivitamisel erinevaid tulemusi. Muudame programmi nii, et iga haru joonistamisel m\u00e4\u00e4ratakse tegur, millega pikkus korrutatakse, juhuslikult. Funktsiooniga <code><code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">randint(6,7)<\/code><\/code> saame juhusliku arvu 6 v\u00f5i 7. Selleks, et saada 0,6 v\u00f5i 0,7 jagame arvuga 10.<\/p>\n<p><strong>N\u00e4iteprogramm. Juhusliku harupikkusega puu<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">from turtle import * \r\nfrom random import *      # Juhuslike arvude moodul\r\n \r\ndef puu(pikkus):\r\n    if pikkus &lt; 5:\r\n        forward(pikkus)\r\n        back(pikkus)\r\n    else:\r\n        forward(pikkus)\r\n        left(40)\r\n        puu(randint(6,7) \/ 10 * pikkus)   # Tegur on 0.6 v\u00f5i 0.7\r\n        right(90)\r\n        puu(randint(6,7) \/ 10 * pikkus)   # Tegur on 0.6 v\u00f5i 0.7\r\n        left(50)\r\n        back(pikkus)\r\n \r\ndelay(0)\r\nspeed(10)\r\nleft(90)\r\npuu(100)\r\n\r\nexitonclick()<\/pre>\n<p>Tulemus v\u00f5ib olla midagi sarnast:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-202\" src=\"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-content\/uploads\/sites\/6\/2019\/01\/puujuhuslik68-300x247.png\" alt=\"\" width=\"300\" height=\"247\" srcset=\"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-content\/uploads\/sites\/6\/2019\/01\/puujuhuslik68-300x247.png 300w, https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-content\/uploads\/sites\/6\/2019\/01\/puujuhuslik68-65x54.png 65w, https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-content\/uploads\/sites\/6\/2019\/01\/puujuhuslik68-225x185.png 225w, https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-content\/uploads\/sites\/6\/2019\/01\/puujuhuslik68-350x289.png 350w, https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-content\/uploads\/sites\/6\/2019\/01\/puujuhuslik68.png 393w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/p>\n<p class=\"vspace\">Teeme n\u00fc\u00fcd programmi, mis paneb mitu juhusliku suurusega puud k\u00f5rvuti.<\/p>\n<p><strong>N\u00e4iteprogramm. Juhuslike puude mets<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">from turtle import * \r\nfrom random import *\r\n \r\ndef puu(pikkus):\r\n    if pikkus &lt; 5:\r\n        forward(pikkus)\r\n        back(pikkus)\r\n    else:\r\n        forward(pikkus)\r\n        left(45)\r\n        puu(randint(6,7) \/ 10 * pikkus)\r\n        right(90)\r\n        puu(randint(6,7) \/ 10 * pikkus)\r\n        left(45)\r\n        back(pikkus)\r\n \r\ndef mets(puudearv):\r\n    i = 0\r\n    left(90)\r\n    while i &lt; puudearv:\r\n \r\n        pendown()\r\n        puu(randint(20,59))        # Juhusliku pikkusega puu\r\n        penup()\r\n        right(90)\r\n        forward(randint(100,149))  # Puude vahe on ka juhuslik\r\n        left(90)\r\n        i = i + 1\r\n \r\ndelay(0)\r\nspeed(10)   \r\nmets(4)\r\n \r\nexitonclick()<\/pre>\n<p>Antud juhul tekib nelja puuga mets:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-203\" src=\"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-content\/uploads\/sites\/6\/2019\/01\/mets4-300x109.png\" alt=\"\" width=\"300\" height=\"109\" srcset=\"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-content\/uploads\/sites\/6\/2019\/01\/mets4-300x109.png 300w, https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-content\/uploads\/sites\/6\/2019\/01\/mets4-65x24.png 65w, https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-content\/uploads\/sites\/6\/2019\/01\/mets4-225x82.png 225w, https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-content\/uploads\/sites\/6\/2019\/01\/mets4-350x127.png 350w, https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-content\/uploads\/sites\/6\/2019\/01\/mets4.png 535w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/p>\n<h3>Korrast kaoseni<\/h3>\n<p>Kuigi me mitmeid asju muutsime ja lasime isegi juhuslikult arvutada, meenutasid saadud kujundid ikkagi puid. Teeme n\u00fc\u00fcd n\u00e4iliselt suhteliselt v\u00e4ikese muudatuse, nimelt muudame \u00fche p\u00f6\u00f6ramise 45 kraadi asemel 44 kraadiks. T\u00f5en\u00e4oliselt me silmaga nendel nurkadel vahet ei teeks.<\/p>\n<p><strong>N\u00e4iteprogramm. Kaootiline puu<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">from turtle import * \r\nfrom random import *\r\n \r\ndef puu(pikkus):\r\n    if pikkus &lt; 5:\r\n        forward(pikkus)\r\n        back(pikkus)\r\n    else:\r\n        forward(pikkus)\r\n        left(44)\r\n        puu(randint(6,7) \/ 10 * pikkus)\r\n        right(90)\r\n        puu(randint(6,7) \/ 10 * pikkus)\r\n        left(45)\r\n        back(pikkus)\r\n \r\ndelay(0)\r\nspeed(10)       \r\nleft(90)   \r\npuu(100)\r\n \r\nexitonclick()<\/pre>\n<p>Mis juhtub kujundiga?<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-204\" src=\"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-content\/uploads\/sites\/6\/2019\/01\/kaos44.png\" alt=\"\" width=\"177\" height=\"249\" srcset=\"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-content\/uploads\/sites\/6\/2019\/01\/kaos44.png 177w, https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-content\/uploads\/sites\/6\/2019\/01\/kaos44-65x91.png 65w\" sizes=\"auto, (max-width: 177px) 100vw, 177px\" \/><\/p>\n<p>N\u00e4eme, et puuga enam tegemist pole ning et v\u00e4ike muudatus viis meid hoopis erineva kujundi juurde. Fraktalite puhul kipubki olema nii, et v\u00e4ike muudatus v\u00f5ib olla v\u00e4ga olulise t\u00e4hendusega.<\/p>\n","protected":false},"author":12,"menu_order":6,"template":"","meta":{"pb_show_title":"on","pb_short_title":"","pb_subtitle":"","pb_authors":[],"pb_section_license":""},"chapter-type":[],"contributor":[],"license":[],"class_list":["post-198","chapter","type-chapter","status-publish","hentry"],"part":166,"_links":{"self":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/pressbooks\/v2\/chapters\/198","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/pressbooks\/v2\/chapters"}],"about":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/wp\/v2\/types\/chapter"}],"author":[{"embeddable":true,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/wp\/v2\/users\/12"}],"version-history":[{"count":5,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/pressbooks\/v2\/chapters\/198\/revisions"}],"predecessor-version":[{"id":489,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/pressbooks\/v2\/chapters\/198\/revisions\/489"}],"part":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/pressbooks\/v2\/parts\/166"}],"metadata":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/pressbooks\/v2\/chapters\/198\/metadata\/"}],"wp:attachment":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/wp\/v2\/media?parent=198"}],"wp:term":[{"taxonomy":"chapter-type","embeddable":true,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/pressbooks\/v2\/chapter-type?post=198"},{"taxonomy":"contributor","embeddable":true,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/wp\/v2\/contributor?post=198"},{"taxonomy":"license","embeddable":true,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/programmeerimine\/wp-json\/wp\/v2\/license?post=198"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}