Autorské riešenie
[stiahni krabice.py]

  • Počet riešiteľov: / = % 

  • Úspešnosť riešenia: 6,5 / 7 = 93%

Predstavme si, že by zadanie úlohy povoľovalo iba jedinú krabicu, v ktorej má Jožko ovocie. Povedzme, že chce zistiť počet jabĺk v tejto krabici. Na riešenie by sme mohli využiť obyčajný for cyklus, ktorý pre každý predmet zistí, či je to hľadané ovocie alebo nie a na základe toho zvýši naše počítadlo.  

#krabica.py
def pocet_kusov(ovocie, krabica):
    pocet_ovocia = 0

    for co_vyberiem in krabica:
        if co_vyberiem == ovocie:
            pocet_ovocia += 1

    return pocet_ovocia

Teraz pridajme podmienku zo zadania, a síce, že to, čo Jožko z krabice vyberie nemusí byť ovocie, ale môže to byť aj ďalšia krabica s ovocím.

V takomto prípade musíme zistiť počet kusov hľadaného ovocia v základnej krabici rovnako ako doteraz, a potom k tomu počtu pripočítať počet kusov tohto ovocia vo vnorených krabiciach. Lenže na spočítanie počtu kusov hľadaného ovocia v krabici sme už pripravili funkciu - teda ju len zavoláme a k nášmu počítadlu pripočítame jej návratovú hodnotu.

To, že predmet, ktorý sme práve vybrali z krabice je ďalšia krabica, vieme programátorsky zistiť pomocou zistenia typu predmetu (type(co_vyberiem) == list) alebo pomocou overenia, či je daný predmet inštanciou triedy list (isinstance(co_vyberiem, list)).  

#krabica.py
def pocet_kusov(ovocie, co_drzim):
    pocet_ovocia = 0

    for co_vyberiem in co_drzim:
        if type(co_vyberiem) == list: 
            pocet_ovocia += pocet_kusov(ovocie, co_vyberiem)
        elif co_vyberiem == ovocie:
            pocet_ovocia += 1

    return pocet_ovocia

Vaše zaujímavé riešenia a najčastejšie chyby

Medzi iné zaujímavé riešenia, ktoré ste priniesli, patrili napríklad:

  • nerekurzívne prehľadávanie krabíc za pomoci while cyklu a dvojsmerného zoznamu,
  • využitie slovníka na spočítanie počtu každého z ovocí nachádzajúcich sa v krabici,
  • využitie rekurzie na vytvorenie jednorozmerného zoznamu (podobne, ako funkcia flatten v niektorých programovacích jazykoch) a následné zistenie počtu hľadaných hodnôt v tomto zozname
  • premapovanie hodnôt na 0 alebo 1 podľa toho, či sa jedná o hľadané ovocie, a následná rekurzívna sumácia premapovaných hodnôt
  • pretypovanie zoznamu na reťazec, čo umožnilo vyhnutie sa rekurzívnemu alebo nerekurzívnemu prehľadávniu listu,
    • toto riešenie však neodporúčame, keďže pretypovanie zoznamu (alebo iných štruktúr) na reťazec neodráža dobré programátorské štandardy.

Chyby, ktoré sa objavili pri riešení tejto úlohy:

  • spočítanie všetkých ovocí v krabici(ach), nerozlišovanie, či sa jedná o hľadané ovocie alebo nie,
  • výpis počtov prednastavnených ovocí,
  • vytvorenie "počítadlovej" premennej mimo funkcie, teda použitie globálnej premennej:
    • funkcia takto vracala správnu hodnotu pri prvom zavolaní, ale nesprávnu pri viacerých volaniach,
  • vyriešenie úlohy pre konkrétny prípad opísaný v zadaní.