2.7 rekursio ja iteraatio

25
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

Upload: gabby

Post on 20-Jan-2016

37 views

Category:

Documents


0 download

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 Presentation

TRANSCRIPT

Page 1: 2.7  Rekursio ja iteraatio

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

Page 2: 2.7  Rekursio ja iteraatio

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ä’.

Page 3: 2.7  Rekursio ja iteraatio

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

Page 4: 2.7  Rekursio ja iteraatio

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

Page 5: 2.7  Rekursio ja iteraatio

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.

Page 6: 2.7  Rekursio ja iteraatio

2.7.1 Rekursio …

Jotta menettely suppenisi eli johtaisi todella ratkaisuun tulee rekursiivisen aliongelman luonnollisestikin olla ongelman alkuperäistä tapausta

yksinkertaisempi.

Page 7: 2.7  Rekursio ja iteraatio

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

Page 8: 2.7  Rekursio ja iteraatio

2.7.1 Rekursio …

Kaikissa ohjelmointikielissä rekursiota eiole mahdollista toteuttaa (mm.

konekielet,eräät vanhat tehtävän läheiset kielet

kutenBasic, Fortran, Cobol)

Page 9: 2.7  Rekursio ja iteraatio

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.

Page 10: 2.7  Rekursio ja iteraatio

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.

Page 11: 2.7  Rekursio ja iteraatio

2.7.1 Rekursio …

Rekursioesimerkkejä monisteessa.

Page 12: 2.7  Rekursio ja iteraatio

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.

Page 13: 2.7  Rekursio ja iteraatio

2.7.2 Iteraatio

Iteraation soveltamiselle asetaan kolmevaatimusta:

väliarvojen olemassaolokeino edetä kohti ratkaisuakyky tunnistaa ratkaisu (ts. pitää tietää milloin toisto lopetetaan).

Page 14: 2.7  Rekursio ja iteraatio

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.

Page 15: 2.7  Rekursio ja iteraatio

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.

Page 16: 2.7  Rekursio ja iteraatio

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.

Page 17: 2.7  Rekursio ja iteraatio

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

Page 18: 2.7  Rekursio ja iteraatio

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

Page 19: 2.7  Rekursio ja iteraatio

2.7.2 Iteraatio …

Menetelmä on tehokas ja yksinkertainen.

Esimerkiksi, jos a = 10 000, kahdeksannumeron tarkkuus saavutetaan jo

yhdeksälläkierroksella.

Page 20: 2.7  Rekursio ja iteraatio

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

Page 21: 2.7  Rekursio ja iteraatio

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

Page 22: 2.7  Rekursio ja iteraatio

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

Page 23: 2.7  Rekursio ja iteraatio

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.

Page 24: 2.7  Rekursio ja iteraatio

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.

Page 25: 2.7  Rekursio ja iteraatio

Rekursio vai iteraatio ? …

Seuraavat kaksi esimerkkiä ratkeavat varsin

helposti rekursion kautta. Iteratiivinenratkaisukin on olemassa, mutta se on

hankalakeksiä:

symbolinen derivointiHanoin tornit