ITI0011-2016:harjutus 17

Allikas: Kursused
Mine navigeerimisribale Mine otsikasti

Üldine

Kaitsmised: 2. - 6. mai
Kaust gitis: EX17

Ülesanne tuleb lahendada rekursiivselt. Selle ülesande puhul on lubatud ka täiendavad tsüklid (muidu ei saa ülesannet lahendada).

Üles tuleb laaddida Child.java (võite täiendavalt testimiseks teha ka muid faile).

Ülesanne

Väikelapsed mängivad liivakastis. Nagu on teada, siis liivakastis kehtivad džungliseadused ning koos mängivad vaid teatud grupid. Sinu ülesandeks on välja selgitada, kui suur laste grupp saab liivakastis rahus mängida.

Tuleb luua Child objekt, milles on defineeritud lapse nimi. Konstruktor kutsutakse välja nimega:

<source lang="java"> Child marta = new Child("Marta"); </source>

Kui soovime öelda, et Marta tahab koos mängida mati ja katiga, siis kutsume välja meetodi marta.playsWith(mati, kati). Vihje: meetod playsWith võib olla selline:

<source lang="java"> public void playsWith(Child... children) {

   for (Child c : children) {} 

} </source> kus children on automaatselt koostatud array Child objektidest. Nii saab playsWith vastu võtta suvalise arvu lapsi.

Staatiline meetod Child.getSandbox(Child child) tagastab juurelemendist alates kõiki lapsed (List<Child>), kes liivakastis mängivad.

<source lang="java"> Child marta = new Child("Marta"); Child mati = new Child("Mati"); Child kati = new Child("Kati");

marta.playsWith(mati); mati.playsWith(kati);

Child.getSandbox(marta); // --> laste nimed: ["Marta", "Mati", "Kati"] </source>

Lisaosa (0.5p)

Lisaosa lahendus on oluliselt keerulisem kui põhiosa oma.

Lisaks saab lapse puhul defineerida, kellega ta absoluutselt ei mängi. Selleks kasutada meetodit doesNotPlayWith(Child... children), mis töötab sarnaselt eelmisele.

Kui lapsed on defineeritud, tuleb leida, kas antud kooslus saab mängida liivakastis koos või mitte. Juhul kui mõne lapsega koos ei mängita, siis tema heidetakse liivakastist välja ning tagastatakse ülejäänute nimed.

<source lang="java">

Child marta = new Child("Marta"); Child mati = new Child("Mati"); Child kati = new Child("Kati");

marta.playsWith(mati); marta.doesNotPlayWith(kati); mati.playsWith(kati);

Child.getSandbox(marta); // --> laste nimed: ["Marta", "Mati"];

</source>

Näpunäiteid

Võite Child objektil laadida üle (override) toString meetodi selliselt, et objekti kuvades näidatakse lapse nime.

Selle ülesande rekursiooni osa on mõnevõrra teise loogikaga kui "tavalised" rekursiooni ülesanded (mida seni oleme teinud ja vaadanud). Mõte on selles, et getSandbox meetod tagastab etteantud lapse puhul kõik temaga mängivad lapsed (tekib grupp lapse sõpradega). Võib mõelda nii, et kui Mati mängib Katiga ja Kati omakorda mõne lapsega, saab moodustada grupi, kus on Kati koos sõpradega. Nüüd Mati mängib Kati ja tema sõpradega (ehk tekib grupp, kus on Mati + Kati sõpradega). Kui Toomas mängib Matiga, mängib ta eelnevalt saadud grupiga jne. getSandbox koostab nimetatud grupid (ja liidab neid kokku).

Lisaosas tuleb teha kitsendusi. Lisaosa lahendus on oluliselt keerulisem kui põhiosa.