Zadání úlohy č. 1
[cviceni2.lhs]
[reseni.lhs]
Základy programování v jazyce Haskell
Spusťte si kompilátor Win Hugs.
Můžete použít tyto příkazy:
- Editace souboru
- Načtení skriptu
- :load [soubor.hs]
- :reload
- Ukončení - :quit
- Nápověda - :?
Implementujte následující úkoly. Funkce, které nestihnete na cvičení si dodělejte doma!
- Faktoriál
Vytvořte funkci, která vrací faktoriál zadaného čísla. Uvažujte různé
varianty specifikace (se vzory, strážními podmínkami, podmíněným výrazem).
- Největší společný dělitel
Vytvořte funkci, která určí největšího společného dělitele dvou celých čísel.
- Délka seznamu
Vytvořte funkci, která vypočte délku libovolného seznamu.
- Spojení dvou seznamů
Vyvořte funkci, která spojí dva seznamy do jednoho.
- Spojení dvou seznamů do seznamu dvojic
Vytvořte
funkci, která ze dvou seznamů vytvoří seznam uspořádaných
dvojic prvků tak, že první dvojici tvoří první prvky obou seznamů atd.
Jsou-li délky seznamů různé, bude mít výsledek délku kratšího z obou zadaných seznamů.
- Vyhledání největšího prvku v seznamu
Vytvořte funkci, která v seznamu vyhledá prvek s největší hodnotou.
Zamyslete se nad tím, jakého typu musí být výsledná funkce.
- Obrácení seznamu - funkce reverse
Vytvořte funkci, která k zadanému seznamu vytvoří nový seznam, obsahující
prvky původního seznamu v obráceném pořadí. Pokuste se najít více možností,
jak tuto úlohu řešit, určete a testy ověřte, jaká je časová a prostorová
složitost nalezených řešení.
- Spojeni seznamů pomocí funkce - funkce zipWith
Vytvořte funkci, která spojí stejnolehlé prvky dvou seznamů do jednoho seznamu
tak, že s nimi provede zadanou binární operaci. Ukažte, jak se pomocí této
funkce dá implementovat funkce zip z prvního cvičení.
- Skalární součin vektorů čísel
Vytvořte funkci, která vypočte skalární součin dvou číselných vektorů.
Najděte řešení pomocí rekurzivních funkcí a potom se pokuste tuto funkci
implementovat pouze kombinací již dříve vytvořených funkcí.
- Kartézský součin
Použijte seznam jako reprezentaci konečné množiny prvků. Vytvořte funkci,
která vypočte kartézský součin dvou množin (obecně různého typu). Najděte
řešení pomocí rekurzivních funkcí a potom se pokuste tuto funkci implementovat
pomocí generátorů seznamů. Je zajištěno, že výsledné řešení opět reprezentuje
množinu (tj. že se prvky výsledného seznamu neopakují)?