2.7 Rekursio ja iteraatio Algoritminen ongelmanratkaisu ei ole

Slides:



Advertisements
Samankaltaiset esitykset
Yhtälön ratkaiseminen
Advertisements

Tämä on SUUNTA-työkalun käyttöön opastava diaesitys
Olio-ohjelmoinnin perusteet luento 3: Muuttujista ja funktioista Sami Jantunen LTY/Tietotekniikan osasto.
Tietorakenteet ja algoritmit
2.8.3 Abstraktit tietotyypit
Yhteystila-algoritmi
1. Olio-ohjelmointi.
Antti-Jussi Lakanen Nuorten peliohjelmointi 2009 / Jyväskylän yliopisto.
Sovellusohjelman suunnittelu & toteutus
AS Automaation signaalinkäsittelymenetelmät
@ Leena Lahtinen Helia OHJELMOINTITAITO ICT02D 12 OP.
OHJELMOINTITAITO ICT02D 12 ECTS. OPINTOJAKSON TOTEUTUS  KESTO: –  PÄIVÄOPISKELIJAT: – KAKSI LUOKAA (SUOMI) –YKSI LUOKKA (ENGLANTI)
(Joskus puhutaan myös komponenttitestauksesta.) Pienin kokonaisuus, joka on järkevä testata erikseen. ● Perinteisesti yksittäinen aliohjelma. ● Olio-ohjelmien.
RSA – Julkisen avaimen salakirjoitusmenetelmä Perusteet, algoritmit, hyökkäykset Matti K. Sinisalo, FL.
5.3.3 Koodin generointi Koodin generointi tarkoittaa objektikoodin eli konekielisen ohjelman tuottamista. Generointi jakautuu kolmeen osatehtävään: 1.Muistin.
Mitoitus yhteistyönä OPS-työ ja mitoitus Oulu Katariina Alha/W5W.
VARHAINEN PUUTTUMINEN
© Lammi-Niskala-Kossarev1 Algoritmiteoriaa Toiset tehtävät (ja sen ratkaisut) vaikeampia kuin toiset Toiset tehtävät (ja sen ratkaisut) vaikeampia kuin.
Kompleksisuuden kertaluokat
Toiston tekeminen Javalla  Mikä toistorakenne on?  while toistorakenne  do-while toistorakenne  for toistorakenne 1.
Ohjelmoinnin tekniikkaa Sisällys for -lause lyhemmin. Vaihtoehtoisia merkintöjä aritmeettisille lauseille. Useiden muuttujien esittely.
Tiedon esittäminen.
2. Vuokaaviot.
© Lammi-Niskala-Kossarev ADT:n toteutus Imperatiivinen paradigma Imperatiivinen paradigma toimenpiteet aktiivisia, tiedot passiivisia toimenpiteet.
1.a) f(x) = 2x(x2 – 3) = 0 2x = tai x2 – 3 = 0 x = tai x2 = 3
Visual Basic -ohjelmointi
Tietokoneohjelman suoritus opintojakso Olioajattelu ja –ohjelmointi, osa I Hans Nieminen Syksy 2013.
Murtoluvun supistaminen
− työkalu toiminnan suunnittelun ja suunnitelman arvioinnin tueksi
Metodit – Arvotyyppi Ellei metodi palauta arvoa, sen arvotyyppi on void Tällöin ”return;”-lauseke ei ole metodissa pakollinen, vaikka sen käyttö on sallittua.
2.8 TIETO- JA TALLETUSRAKENTEET
© Lammi-Niskala-Kossarev 1 Kertausta (lu 05-06) Algoritmin perusvaatimukset Miksi ei luonnollista kieltä ohjelmointiin Syntaksi, semantiikka ja pragmatiikka.
@ Leena Lahtinen OHJELMAN OSITTAMINEN LUOKKA ATTRIBUUTIT METODIT.
Toistorakenne Toistorakennetta käytetään ohjelmissa sellaisissa tilanteissa, joissa jotain tiettyä ohjelmassa tapahtuvaa toimenpidekokonaisuutta halutaan.
3.2 Kompleksisuus Vain pieni osa kaikista tehtävistä on laskettavissa tai edes osittainkaan laskettavissa. Laskettavien osalta saattaa olla tarpeellista.
OHJELMOINTITAITO ICT02D 12 ECTS. OPINTOJAKSON TOTEUTUS  KESTO: –  AVOIMEN OPISKELIJAT: – YKSI LUOKA (SUOMI) – LUOKKA ICT02O-1.
@ Leena Lahtinen Toistorakenne Ohjelmassa toistetaan tiettyjä toimenpiteitä monta kertaa peräkkäin Toisto noudattaa sille kuuluvia tarkkoja standardoituja.
1 Ohjelmointikielten varhaishistoria Esa-Matti Miettinen
5. Lineaarinen optimointi
Rinnakkaisuus Järjestelmässä, jossa voi olla useita prosesseja rinnakkain suorituksessa voi tulla tilanteita, joissa prosessien suoritusta täytyy kontrolloida.
Kymmenkantainen logaritmi
Kontrollirakenteet laajemmin
Visual Basic -ohjelmointi
Toistorakenne Toistorakennetta käytetään ohjelmissa sellaisissa tilanteissa, joissa jotain tiettyä ohjelmassa tapahtuvaa toimenpidekokonaisuutta halutaan.
3.1. SOVELLUKSIA, pinta-ala
Valintarakenne valintarakenne alkaa aina kysymyksellä eli ehdolla ehto tarkoittaa, että muuttujan sisältöä verrataan toisen muuttujan sisältöön tai vakioon.
21. Rekursio.
FOR i := 0...N-1 DO summa := summa + A[i] tulo := tulo * A[i] ENDFOR.
Ohjelma Mikro-ohjelmointi Symbolinen konekieli Osoitustavat.
Hajoita ja hallitse (divide and conquer) Pikalajittele n-alkioinen taulukko 1. Divide: Jaetaan taulukko kahdeksi alitaulukoksi tukialkion (pivot) x suhteen:
Ohjelmassa tänään Ohjelmointimallit Pseudokieli Modulaarisuus.
2/2001 Tietojärjestelmät ja Systeemisuunnittelu Luennoitsija: Tapio Lammi
Toistorakenne Toistorakennetta käytetään ohjelmissa sellaisissa tilanteissa, joissa jotain tiettyä ohjelmassa tapahtuvaa toimenpidekokonaisuutta halutaan.
Monadit TIES341 Funktio-ohjelmointi 2 Kevät 2006.
Jatkeet TIES341 Funktio-ohjelmointi 2 Kevät 2006.
Uusi näkökulma TIEA341 Funktio-ohjelmointi 1 Syksy 2005.
Toistorakenne Toistorakennetta käytetään ohjelmissa sellaisissa tilanteissa, joissa jotain tiettyä ohjelmassa tapahtuvaa toimenpidekokonaisuutta halutaan.
8. Rekursio.
OHJELMOINTITAITO ICT02D 12 Leena Lahtinen Helia
Ohjelmien suunnittelu
Toisto Toistolausekkeet for, while(ehto){…} ja do {…} while(ehto)
16. Ohjelmoinnin tekniikkaa
OHJELMOINTITAITO ICT02D 12 Leena Lahtinen Helia
8. Rekursio.
© Lammi-Niskala-Kossarev
Kontrollirakenteet laajemmin
OHJELMOINTITAITO ICT02D 12 ECTS.
OHJELMOINTITAITO ICT02D 12 ECTS.
OHJELMOINTITAITO ICT02D 12 ECTS.
16. Ohjelmoinnin tekniikkaa
Esityksen transkriptio:

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

2.7 Rekursio ja iteraatio … Rekursiivinen moduuli sisältää moduulin itsensä kutsun ja iteratiivinen moduuli sisä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) ITERAATIO WHILE aitaa maalamatta DO suorita laudan maalaus siirry seuraavaan lautaan ENDWHILE ENDMODULE MODULE maalaa (aita) REKURSIO IF aitaa maalamatta THEN maalaa (loput aidasta) ENDIF

2.7.1 Rekursio MODULE maalaa (aita) ITERAATIO WHILE aitaa maalamatta DO suorita laudan maalaus siirry seuraavaan lautaan ENDWHILE ENDMODULE MODULE maalaa (aita) REKURSIO IF aitaa maalamatta THEN suorita laudan maalaus maalaa (loput aidasta) ENDIF

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: Moduulissa pitää kuvata ainakin yksi ongelman triviaali tapaus, joka ratkeaa suoraan, siis ei-rekursiivisesti, ja Jokaisen rekursiivisen kutsun tulee lähestyä jotakin tällaista triviaalia tapausta

2.7.1 Rekursio … Kaikissa ohjelmointikielissä rekursiota ei ole mahdollista toteuttaa (mm. konekielet, eräät vanhat tehtävän läheiset kielet kuten Basic, Fortran, Cobol)

2.7.1 Rekursio … Jos moduuli kutsuu itseään, on kyseessä suora rekursio. Tämä on tyypillisin tapaus rekursiosta. Esim. aidan maalaus. Epäsuora rekursio: jokin osaongelma sisältää rekursiivisen kutsun.

Epäsuoran rekursion esimerkki: MODULE M1 MODULE M2 … … M2 … … M1 ENDMODULE … ENDMODULE Epäsuora rekursio tekee algoritmeista vaikeasti ymmä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 kolme vaatimusta: väliarvojen olemassaolo keino edetä kohti ratkaisua kyky tunnistaa ratkaisu (ts. pitää tietää milloin toisto lopetetaan).

2.7.2 Iteraatio … Esimerkiksi järjestä-moduulissa: vaadittavat välitilat ovat lukujonon eri järjestykset kullakin 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, kun i = n-1.

2.7.2 Iteraatio … Iteraatio on luonteva lähestymistapa tehtävissä, jossa ei välttämättä saada tarkkaa 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ä luvun neliöjuuri = 1 (merk. x1). Lasketaan sitten ns. Newtonin kaavalla aina uusia ja uusia x-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.

Esimerkki: neliöjuuri jatkuu 2.7.2 Iteraatio … Esimerkki: neliöjuuri jatkuu MODULE neliöjuuri (a, eps) RETURNS √a n:=1 x1:=1 REPEAT xn+1 = ½(xn + a/xn) n:=n+1 UNTIL xn-1 – xn < eps RETURN xn

Esimerkki: neliöjuuri jatkuu, parempi versio: 2.7.2 Iteraatio … Esimerkki: neliöjuuri jatkuu, parempi versio: MODULE neliöjuuri (a, eps) RETURNS √a nykyinen:=1 REPEAT edellinen:=nykyinen nykyinen:= ½(edellinen + a/edellinen) UNTIL edellinen-nykyinen < eps RETURN nykyinen ENDMODULE

2.7.2 Iteraatio … Menetelmä on tehokas ja yksinkertainen. Esimerkiksi, jos a = 10 000, kahdeksan numeron tarkkuus saavutetaan jo yhdeksällä kierroksella.

2.7.2 Iteraatio … Integrointiesimerkki Käyrän ja x-akselin välisen rajoittaman alueen pinta-ala voidaan laskea approksimatiivi- sesti laskemalla yhteen pylväiden pinta-alat (kuvio).

2.7.2 Iteraatio … MODULE integroi (f, a, b) RETURNS luku I:=0 n:=99999999 (* n:n arvoksi suuri luku *) dx:=(b-a)/n FOR x:=0, 1, 2,…, n-1 DO I:=I+f(a+x*dx) ENDFOR RETURN 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 b A:=A U {b} (* alkio b lisätään joukkoon A *) m:=b S:=S- {m} (* poistetaan m joukosta S*) m:=m+b UNTIL m > n UNTIL b > √n RETURN 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. Iteratiivinen ratkaisukin on olemassa, mutta se on hankala keksiä: symbolinen derivointi Hanoin tornit