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:

Implementujte následující úkoly. Funkce, které nestihnete na cvičení si dodělejte doma!

  1. 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).
  2. Největší společný dělitel
    Vytvořte funkci, která určí největšího společného dělitele dvou celých čísel.
  3. Délka seznamu
    Vytvořte funkci, která vypočte délku libovolného seznamu.
  4. Spojení dvou seznamů
    Vyvořte funkci, která spojí dva seznamy do jednoho.
  5. 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ů.
  6. 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.
  7. 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í.
  8. 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í.
  9. 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í.
  10. 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í)?