2.7 rekursio ja iteraatio
DESCRIPTION
2.7 Rekursio ja iteraatio. Algoritminen ongelmanratkaisu ei ole läheskään aina triviaalien moduuleiden kirjoittamista. Ongelman ratkaisun ydin perustuu usein sopivan toisto-osan löytymiseen. Toiston ohjelmointiin on kaksi näennäisesti erilaista ratkaisutapaa: rekursio ja iteraatio. - PowerPoint PPT PresentationTRANSCRIPT
2.7 Rekursio ja iteraatio
Algoritminen ongelmanratkaisu ei oleläheskään aina triviaalien moduuleiden kirjoittamista.Ongelman ratkaisun ydin perustuu useinsopivan toisto-osan löytymiseen. Toistonohjelmointiin on kaksi näennäisesti erilaista ratkaisutapaa:
rekursio jaiteraatio
2.7 Rekursio ja iteraatio …
Rekursiivinen moduuli sisältää moduulinitsensä kutsun ja iteratiivinen moduulisisältää toistorakenteen.
Rekursio ja iteraatio ovat keinoja etsiäongelmanratkaisuja algoritmien
suunnittelu-menetelmien (esim. top-down) ’sisällä’.
2.7 Rekursio ja iteraatio …
MODULE maalaa (aita) ITERAATIOWHILE aitaa maalamatta DO
suorita laudan maalaussiirry seuraavaan lautaan
ENDWHILEENDMODULE
MODULE maalaa (aita) REKURSIOIF aitaa maalamatta THEN
suorita laudan maalausmaalaa (loput aidasta)
ENDIFENDMODULE
2.7.1 Rekursio
MODULE maalaa (aita) ITERAATIO
WHILE aitaa maalamatta DOsuorita laudan maalaus
siirry seuraavaan lautaanENDWHILE
ENDMODULE
MODULE maalaa (aita) REKURSIOIF aitaa maalamatta THEN
suorita laudan maalausmaalaa (loput aidasta)
ENDIFENDMODULE
2.7.1 Rekursio…
Rekursio on modulaarisuusperiaatteen suora seuraus, eikä suinkaan mikään erillinen ominaisuus tai sallittu temppu.Rekursio on yleisen ongelmanratkaisu-periaatteen, reduktioperiaatteen erikoistapaus.Reduktiota sanotaan rekursioksi, jos ainakin yksi osaongelma on alkuperäisen ongelman kaltainen.
2.7.1 Rekursio …
Jotta menettely suppenisi eli johtaisi todella ratkaisuun tulee rekursiivisen aliongelman luonnollisestikin olla ongelman alkuperäistä tapausta
yksinkertaisempi.
2.7.1 Rekursio …
Rekursiivisten moduulien konstruoimisessa
on huomattava kaksi seikkaa:1. Moduulissa pitää kuvata ainakin yksi
ongelman triviaali tapaus, joka ratkeaa suoraan, siis ei-rekursiivisesti, ja
2. Jokaisen rekursiivisen kutsun tulee lähestyä jotakin tällaista triviaalia tapausta
2.7.1 Rekursio …
Kaikissa ohjelmointikielissä rekursiota eiole mahdollista toteuttaa (mm.
konekielet,eräät vanhat tehtävän läheiset kielet
kutenBasic, Fortran, Cobol)
2.7.1 Rekursio …
Jos moduuli kutsuu itseään, on kyseessäsuora rekursio. Tämä on tyypillisin
tapausrekursiosta. Esim. aidan maalaus.
Epäsuora rekursio: jokin osaongelmasisältää rekursiivisen kutsun.
2.7.1 Rekursio …
Epäsuoran rekursion esimerkki:
MODULE M1 MODULE M2… …M2 …… M1
ENDMODULE …ENDMODULE
Epäsuora rekursio tekee algoritmeista vaikeastiymmärrettäviä ei suositella.
2.7.1 Rekursio …
Rekursioesimerkkejä monisteessa.
2.7.2 Iteraatio
Iteraatioperiaate tarkoittaa sitä, että jotakin toimenpidettä toistamalla päästään yhä lähemmäksi ratkaisua tai asetettua tavoitetta.Tarkoitus on siis tuottaa yhä parempia ja parempia ratkaisuja, ns. välitiloja tai likiarvoja ongelman ratkaisulle. Prosessi päättyy, kun saadaan joko tarkka ratkaisu tai riittävän tarkka likiarvo.
2.7.2 Iteraatio
Iteraation soveltamiselle asetaan kolmevaatimusta:
väliarvojen olemassaolokeino edetä kohti ratkaisuakyky tunnistaa ratkaisu (ts. pitää tietää milloin toisto lopetetaan).
2.7.2 Iteraatio …
Esimerkiksi järjestä-moduulissa:vaadittavat välitilat ovat lukujonon eri järjestyksetkullakin ulomman silmukan toistokerralla päästään yhä lähemmäksi ratkaisua: jono on oikeassa järjestyksessä alusta lukien i:nteen alkioon saakka, i = 1, 2, … n-1.tarkka ratkaisu on saavutettu, kuni = n-1.
2.7.2 Iteraatio …
Iteraatio on luonteva lähestymistapatehtävissä, jossa ei välttämättä saadatarkkaa ratkaisua, vaan on tyydyttävälikarvoon.
Monet numeerisen analyysin menetelmät
ovat tällaisia.
2.7.2 Iteraatio …
Esimerkki: neliöjuuri, √a = ?Newtonin menetelmä: oletetaan, että
luvunneliöjuuri = 1 (merk. x1). Lasketaan sitten
ns. Newtonin kaavalla aina uusia ja uusiax-arvoja: x2, x3,…. Seuraava x-arvo on
edeltäjäänsä lähempänä √a :n arvoa.Kaava:xn = ½(xn-1 + a/xn-1), n > 1.
2.7.2 Iteraatio …
Esimerkki: neliöjuuri jatkuuMODULE neliöjuuri (a, eps) RETURNS √a
n:=1x1:=1
REPEATxn+1 = ½(xn + a/xn)
n:=n+1UNTIL xn-1 – xn < eps
RETURN xn
2.7.2 Iteraatio …
Esimerkki: neliöjuuri jatkuu, parempi versio:
MODULE neliöjuuri (a, eps) RETURNS √a nykyinen:=1REPEAT
edellinen:=nykyinennykyinen:= ½(edellinen + a/edellinen)
UNTIL edellinen-nykyinen < epsRETURN nykyinen
ENDMODULE
2.7.2 Iteraatio …
Menetelmä on tehokas ja yksinkertainen.
Esimerkiksi, jos a = 10 000, kahdeksannumeron tarkkuus saavutetaan jo
yhdeksälläkierroksella.
2.7.2 Iteraatio …
Integrointiesimerkki
Käyrän ja x-akselinvälisen rajoittamanalueen pinta-ala
voidaanlaskea approksimatiivi-sesti laskemalla yhteenpylväiden pinta-alat(kuvio).
VAR00001
20,8
19,8
18,8
17,8
16,8
15,9
14,9
13,9
12,9
12,0
11,0
10,0
9,0
8,0
7,1
6,1
5,1
4,1
3,2
2,2
1,2
,2
-,8
Cases weighted by VAR00002
40
30
20
10
0
2.7.2 Iteraatio …
MODULE integroi (f, a, b) RETURNS lukuI:=0n:=99999999 (* n:n arvoksi suuri luku *)dx:=(b-a)/nFOR x:=0, 1, 2,…, n-1 DO I:=I+f(a+x*dx) ENDFORRETURN I*dx
ENDMODULE
2.7.2 Iteraatio …
Eratostheneen (276-195 eKr.) seula etsii alkulukuja:MODULE seula (n) RETURNS alkulukujen joukko
S:= {2, 3, 4, 5, 6, …, n}A:= Ø (* tyhjä joukko *)REPEAT
Etsi joukon S pienin luku bA:=A U {b} (* alkio b lisätään joukkoon A *)m:=bREPEAT
S:=S- {m} (* poistetaan m joukosta S*)m:=m+b
UNTIL m > nUNTIL b > √nRETURN A U S
ENDMODULE
2.7.3 Rekursio vai iteraatio ?
Rekursio ja iteraatio ovat vaihtoehtoisia strategioita. Jokainen rekursiivinen algoritmi voidaan muuntaa iteratiiviseksi ja päinvastoin.Imperatiivisessa ajattelussa iteraatio on varsin tavallinen ajattelutapa, koska kyseinen työskentelytapa on lähellä tietokoneen toiminta-mallia.Rekursio puolestaan perustuu modulaarisuuteen ja reduktiiviseen ajatteluun, joka taas on luonteenomaista esim. funktionaalisessa ohjelmoinnissa.
Rekursio vai iteraatio ? ….
Jotkin tehtävät ovat sellaisia, että niille on kohtuullisen helposti löydettävissä joko rekursiivinen tai iteratiivinen ratkaisu mutta ei molempia.On myös tehtäviä, joille ei ole olemassa luonnollista ei-rekursiivista ratkaisua, kyseessä ovat ns. ei-rekursiiviset tehtävät.
Rekursio vai iteraatio ? …
Seuraavat kaksi esimerkkiä ratkeavat varsin
helposti rekursion kautta. Iteratiivinenratkaisukin on olemassa, mutta se on
hankalakeksiä:
symbolinen derivointiHanoin tornit