Tikk-takk
n= n+1
A szekvenciális programnyelvekben - amelyek meghatározott sorrendben hajtják végre az utasításokat, (pl. Basic, Pascal, Maple) a címben szereplő utasítás a leggyakrabban használtak egyike. Azt jelenti, hogy n új értéke legyen a régi értékénél 1-el nagyobb. Ebben az = vagy a := un. értékadó utasítás, szemben az egyenletekben szereplő = (reláció) jellel.
A lényeg, hogy a GeoGebra mindent egyszerre kezel, ha egy objektum értéke megváltozik, akkor ez kihat az összes leszármazottjára. Ezért van az, hogy az n=n+1 egyenlőségével nem tud mit kezdeni: azt a hibát írja ki, hogy körkörös definíció. És igaza van! Így nem tudunk ciklust megadni . Ezt a programnyelvet másra találták ki.
Egy kivétel van, a különböző objektumok scriptjében (szó szerint: script = írás, szöveg) fogadható el ez az utasítás. Ugyanis ott van egy feltétel: vagy kattintásra, vagy az objektum frissítésekor (értékének a megváltozáskor) hajtja végre a scriptbe leírt utasításokat, valahányszor fennáll a végrehajtás feltétele, ami viszont egymást követő (szekvenciális) esemény.
Ez teszi lehetővé, hogy pl. " fej vagy írást "játsszunk. Addig dobáljuk a pénzérmét, amíg meg nem unjuk, vagy, be nem következik valami kellemetlen esemény, pl. elfogy a pénzünk. Ezt fogjuk most szimulálni.
Fej vagy írás
Bármely programnyelvben viszonylag egyszerű programozási feladatnak számít a fej vagy írás játék szimulálása. A relatív gyakoriság sajátosságainak a szemléltetésére jól használható véletlen szám generátorok vannak a GeoGebrában is, mint ha tényleg játszanánk a pénzérmékkel.
A GeoGebrában azt nehéz megoldani, hogy egy ilyen kísérletet sokszor el kell végezni ahhoz, hogy azt lássa a felhasználó, hogy a relatív gyakoriság (kedvező esetek száma)/(összes kísérlet száma) a várható valószínűség körül - egyre kevésbé - ingadozik, de mégsem használhatjuk a határérték számításban használt "Bármely 0<ε -hoz van olyan N ..." kezdetű mondatot.
Ezt egy tetszőleges csúszkának, vagy adott pályán mozgó pontnak a scriptjébe írt parancsokkal tudjuk megoldani, ahol csak azt kell vezérelnünk, hogy az objektum animációja addig fusson, amíg le nem állítjuk, vagy nem keletkezik a leállítást kiváltó állapot.
Az alábbi appletben ez a Tikktakk nevű két állapotú csúszka, amely a 0 és 1 számot állítja elő (aminek az értékét nem is használjuk). A program lényege csúszka scriptjében van, amely végrehajtásra kerül minden értékadásnál, vagyis ha mozog.
ill.
jelre kattintva állítható meg ill. folytatható.
- r=random(0,1)
- k=k+r
- n=n+1
- h=h+2 k-1
- Animál(Tikktakk, -p<k<p)
Ha már itt tartunk...
... bemutatunk néhány talán kevésbé ismert de hasznosnak tűnő fogást.
Ennél az egyszerű valószínűségszámítási kísérletnél is felvetődhet egy másik kérdés is: mennyire fordulhatnak elő a játékos számára jó ill. rossz irányba mutató hosszabb sorozatok?
Ezzel kapcsolatos a valószínűségszámításban a "részeg tengerész tétele" néven ismert összefüggés. Eszerint ott tántorog egy híd közepén a részeg tengerész, aki egyforma eséllyel jobbra, vagy balra lép egyet-egyet. A tétel szerint előbb-utóbb el fog jutni a híd valamelyik végére.
Ugyanezt így is fogalmazhatjuk: valaki bemegy a kaszinóba fej vagy írást játszani, p zsetonnal a zsebében.
Megígérte (magának?), hogy akkor hagyja abba a játékot, ha a pénzét megduplázza, vagy az egészet elveszíti. A részeg tengerész tétele értelmében ezt a stratégiát választva legjobban tenné, ha egyszerre feltenné az egészet, és már mehetne is haza. Ha egyesével rakja fel a zsetonjait, akkor is pontosan ugyanannyi - azaz 50% - az esélye, hogy a számára kedvező, vagy kedvezőtlen eset bekövetkezzen. (A rulettnél, ahol a piros vagy fekete mezőre lehet tenni, akár egyenként, nagyobb a veszteség esélye, mert ha a 0 "jön ki", akkor a bank elviszi a pirosra és a feketére tett zsetonokat is.)
Nos ezt (is) szemlélteti a fenti applet: ezt kezeli a p és h változó.
Azt is szemléltetjük, hogy hogyan tántorog a tengerész. (Rá lehet zoomolni az egérgörgővel.) Ettől eltűnik az addigi "nyoma" amely a játékos aktuális egyenlegétől függően piros, vagy zöld.
Általában így szoktuk az egérgörgővel letörölni a már nem kívánt nyomvonalakat. De erre van egy scriptből vezérelt, vagy a parancssorba beírható "varázsige" is, amit most a kezdő adatokat beállító Restart gomb scriptjébe írtunk: Nagyítás(1) Ebbe a parancsba 1 helyett más számot írva valóban nagyítani, kicsinyíteni tudjuk a rajzlapot.
Apró, de olykor hasznos trükk lehet, ha egy objektum - jelen esetben a körlap színe - dinamikusan változik. Itt most a piros szín intenzitását a Ha(rgy<0.5+ε, 1, 0.2) a zöldét a Ha(rgy > 0.5 - ε, 0.6, 0) értékek vezérlik, ahol rgy=k/n a relatív gyakoriság, ε=0.01 , vagyis a kör színe akkor lesz sárga, ha rgy értéke 0.01-nél közelebb kerül a várható 0.5-es értékhez.
Talán kevésbé tűnik fel, hogy a rajzlap zoomolásánál, mozgatásánál a körlap nem mozdul. Azért nem, mert a középpontját és egy kerületi pontját a képernyőhöz (és nem a rajzlaphoz) rögzítettük. Ez egy viszonylag ritkán használt GeoGebra utasítás, amiről azonban jó ha tudunk.
Pl. itt a K=MásolatCsatolásaNézethez((0,0),1,(0,0),(-10, 10),(100, 160),(0, 0)) utasítással értük el, hogy a kör K középpontja a képernyő bal szélétől 100, a felsőtől 160 pixelnyire legyen. Ez egy elég bonyolult utasítás, de a lényege ebből a példából kiolvasható.
Murphy törvénye szerint minden program addig fejlődik, amíg meg nem haladja a szerzője képességeit. Ezen a programon bizonyára még sokat lehetne cicomázni, de már így is túl nagyra sikerült fújni ezt a kicsi lufit.
Hideg → langyos → forró → tűz, tűz....
Mindenki sokszor játszotta gyerek korában ezt a rejtsük el, ... keressük meg játékot. Az iménti Tikktakk nevű leegyszerűsített csúszka scriptjébe könnyen beépíthetjük a legegyszerűbb kereső algoritmust, a felező módszert.
Feladat:
Rejtsünk el a számegyenes (0,10) intervallumán egy véletlen számot, majd keressük meg.
Helyesebben: közelítsük meg olyan pontosan, ahogy csak ezt a Geogebra "motorja" lehetővé teszi.
(Ez a motor elég jó: A GeoGebra 10 -13 -ig nagy biztonsággal számol.)
A program érdemi része mindössze az alábbi néhány utasítás: a közismert oroszlánfogás - intervallum felezés - módszere. Persze ez kiegészül a Restart gomb és a Tikktakk csúszka scriptjébe írt utasításokkal:
Restart:
- n=1
- r= 10 Véletlenszám()
- a= 0
- b= 10
- Animál(Tikktakk,true)
- n:=n+1
- a:=Ha(c
- b:=Ha(c>r,c,b)
- Animál(Tikktakk,¬OK)
3n+1
Próbálják meg olvasóik ezt a rövid képletet beírni az internet kereső programjába.
Meglepően hamar el fognak jutni egy ma is nyitott matematikai problémához, amely Collatz sejtés címen került be a matematikai köztudatba.
Lothar Collatz (1910-1990) német matematikus fogalmazta meg 1937-ben azt a meglepően egyszerű algoritmust, amelyet az alábbi appletben mutatunk be.
Maga az algoritmus első pillantásra igen egyszerűnek tűnik.
Alaphelyzetben az itt is Tikktakk -nak nevezett kétállapotú csúszka animációja még nem működik. Így - lépésenként - könnyebben követhető, hogy mi történik, ha bemenő adat pl. 9.
Próbálják ki. Eljutunk az 1-ig, tehát megáll a program. Hány lépés kellett hozzá?
Ha már n=1, megjelenik egy "bolondbiztos" beviteli mező. Ebbe írjanak be most 27-et (+Enter)!
Miért "kell" egy beviteli mezőnek - általában minden felhasználói programnak - bolondbiztosnak lennie? Ez a jelző az asztali (iskolai) számítógépek elterjedése idején került be a számítástechnikai szlengbe. Akkor, amikor mindenki programozni tanult, a Collatz algoritmus kiváló gyakorló terepe volt tanárnak, diáknak. Gyakran előfordult, hogy ha a "jobb" diákok meglátták az "Írj be egy 1 -nél nagyobb egész számot! n=? " szöveget, rákönyököltek a klaviatúrára, majd ártatlan ibolyakék szemmel ránéztek a tanárra, hogy "Rossz a program!" Igazuk volt! Próbálják ki, most is így van-e.
Nos, visszatérve a 27-re, egy idő után a felhasználóban felvetődik az az igény, hogy kapcsoljuk be az animációt. A másik csúszkával tudjuk változtatni a Tikktakk animációjának a sebességét. Lényegében ez volt a célja az applet bemutatásának. De erről később.
Érdemes kicsit játszani a programmal: írjunk a beviteli mezőbe néhány 1-nél nagyobb egész számot.
A kíváncsi ember számára ezek a kérdések vetődhetnek fel:
- Egy adott számból kiindulva hány lépésben jutunk el az 1-ig?
- Eközben a kiindulásul vett szám hányszorosa lesz az a legnagyobb szám, amelyik "megfordul a számítógép fejében"?
- Találunk-e olyan számot, amelyik igen sok lépés után jutunk el 1-ig?
- Vajon bármely pozitív egész számból kiindulva eljutunk-e 1-ig?