User Tools

Site Tools


laboratoare:01-functii-recursive

This is an old revision of the document!


A PCRE internal error occured. This might be caused by a faulty plugin

====== Laborator 2 - Funcții recursive ====== Scopul acestui laborator este a de familiariza studenții cu limbajul Haskell. ===== Platforma Haskell ===== Pentru început, avem nevoie de un mod de a compila cod. Puteți descărca platforma Haskell de [[https://www.haskell.org/platform|aici]] (Windows/OS X/Linux) sau puteți instala pachetul "ghc". Vom lucra în modul interactiv, care ne permite să apelăm funcții din consolă și să vedem rezulatul lor. Putem să încărcăm și fișiere cu fragmente de cod din care să apelăm funcții definite de noi. Pentru modul interactiv, rulați "ghci". Ar trebui să vedeți ceva asemănător: <code> GHCi, version 7.10.3: http://www.haskell.org/ghc/ :? for help Prelude> </code> ^ Comenzi folositoare în ghci: ^^ ^ Comandă ^ Efect ^ |:l //filename// | încarcă un fișier din directorul din care e rulat ghci | |:r | reîncarcă ultimului fișier încărcat | |:t //expresie// | afișează tipul expresiei | |:? | afișează meniul de help cu comenzile disponibile | |:q | închide ghci | ===== Funcții în Haskell ===== ==== Apelare ==== În Haskell, funcțiile pot fi prefixate sau infixate. Cele prefix sunt mai comune, au un nume format din caractere alfanumerice și sunt apelate prin numele lor și lista de argumente, toate separate prin spații (fără paranteze sau virgule): <code> <Prelude>max 1 2 2 </code> Funcțiile infixate sunt cele cu nume formate din caractere speciale, de forma //operand1 operator operand2// <code> <Prelude>1 + 2 3 </code> <note> În anumite situații ne-am dori să schimbăm modul de afixare al funcțiilor (e.g. din motive de claritate).\\ Pentru a prefixa o funcție infixată, folosim operatorul ''()''. Astfel, următoarele expresii sunt echivalente: <code> 3 * 23 (*) 3 23 </code> Dacă o funcție are două argumente, putem să o infixăm cu operatorul ''``'' (//backticks// - dacă nu veți un layout exotic, ar trebui să fie pe tasta de dinainte de 1). Astfel, următoarele două expresii sunt echivalente: <code> mod 10 3 10 `mod` 3 </code> </note> ==== Definirea unei funcții ==== Creați, în editorul de text preferat, un fișier cu extensia ''.hs'' în care vom defini prima funcție: <code haskell> -- intoarce succesorul dublului celui mai mare dintre cele două argumente myFunc x y = succ (2 * max x y) </code> <note important> Rolul parantezelor aici este de a forța ordinea dorită de a efectua operațiilor. Altfel funcția ar înmulți 3 (succesorul lui 2) cu cel mai mare dintre numere. </note> Puteți testa funcția din ghci: <code> <Prelude>:l first.hs [1 of 1] Compiling Main ( first.hs, interpreted ) Ok, modules loaded: Main. *Main> myFunc 10 11 23 *Main> myFunc 2 30 61 </code> * Cum rulam cod Haskell. Editor. Interpretor. * Definitia unei functii in Haskell. Specificarea parametrilor. * Apelul unei functii in Haskell. Folosirea parantezelor. * Pattern matching pe liste in Haskell. Ordinea specificarii pattern-urilor. * Despre tipuri in Haskell: * Exemplu: ''%%[1,2]:[3,4] = [[1,2],3,4]%%'' (de ce acest lucru nu este posibil in Haskell?) ==== Exercitii ==== * Determinarea factorialului unui numar (implementare fara restrictii + implementare tail-end) * Determinarea numarului n din sirul lui Fibbonacci (implementare fara restrictii + implementare tail-end) * Concatenarea si inversarea unei liste * Implementare Mergesort (folosind ''take'', ''drop'' si ''div'') * Implementare Insertion sort * Implementare Quicksort * Calculul inversiunilor dintr-o lista ==== Q & A === * ! Aceasta zona poate fi editata de studenti ==== Solutii laborator ==== * [[https://github.com/Programming-Paradigms/Labs/archive/master.zip|Solutii laborator 1]] * Puteti, alternativ, sa folositi urmatorul [[https://github.com/Programming-Paradigms/Labs.git|repository git]] pentru a descarca solutiile si le sincroniza, ulterior. * Git si GitHub [[https://try.github.io| - tutorial]].

laboratoare/01-functii-recursive.1456530812.txt.gz · Last modified: 2016/02/27 01:53 by mihai.dumitru2201