Sunteți pe pagina 1din 12

Inteligen artificial

Laboratorul 3

Vectori i secvene. Alte colecii

Obiectivele acestui laborator sunt urmtoarele:

prezentarea unor elemente de programare imperativ: variabile, bucle;


descrierea vectorilor, secvenelor i a altor colecii F#: tabele hash i mulimi.

2. Elemente de programare imperativ: variabile, bucle


n laboratoarele anterioare, am insistat asupra ideii de programare funcional pur, fr
efecte secundare (engl. side effects). Efectele secundare apar atunci cnd o funcie realizeaz i
altceva dect returnarea unei valori. ns programele reale au deseori astfel de scopuri: afiarea unor
date, salvarea acestora pe hard-disk, comunicaii n reea etc. Programarea funcional, cu date
imutabile i descriere generic a scopurilor, reduce ansele de apariie a unor erori. ns
programarea imperativ poate aduce un plus de eficien, o mai mare claritate datorit obinuinei
programatorilor cu aceast paradigm i poate asigura interoperabilitatea cu programele existente.
Dei F# integreaz elemente de programare imperativ, acestea nu trebuie abuzate. Exist
echivalente funcionale pentru ele, aa nct nu trebuie folosite dect dac rezolv mai simplu i mai
clar o anumit problem.
Variabilele se marcheaz explicit ca mutabile:
let mutable x = 0

Modificarea variabilelor se realizeaz cu o sintax diferit, fr cuvntul cheie let:


x <- x + 1

Trebuie spus c i n cazul valorilor imutabile, este permis urmtoarea secven de cod:
let x = 0
let x = x + 1

ns n acest caz, valoarea incrementat a lui x nu este memorat n aceeai locaie de


memorie ca x. Se declar de fapt o nou valoare, egal cu x + 1. Compilatorul execut intern o
secven de tipul:

Inteligenta artificiala - Laborator, http://florinleon.byethost24.com/lab_ia.htm

Inteligenta artificiala - Laborator, http://florinleon.byethost24.com/lab_ia.htm

1. Obiective

Valoarea iniial a lui x nu mai este accesibil, dei se pstreaz n memorie. Acest proces
care imit actualizarea unei variabile, dar respect ideea de imutabilitate, i care se face cu un
consum de memorie suplimentar, se numete shading.
n programarea funcional pur, buclele nu sunt posibile pentru c nu este posibil
actualizarea valorii unui contor. Iteraiile sunt realizate prin funcii recursive, unde apelurile
succesive au valori actualizate ale argumentelor. n F# exist ns construcii imperative de tip
bucl, care pot fi exprimate n mai multe moduri, dup cum se arat mai jos.
let mutable i = 0
while i < 10 do
i <- i + 1
printfn "%d" i
for i = 1 to 10 do
printfn "%d" i
for i = 10 downto 1 do
printfn "%d" i
for i in 1 .. 10 do // sau: for i in [1 .. 10] do
printfn "%d" i

n ultimul caz, se folosete enumeratorul listei, fiind echivalentul lui foreach din C#.

3. Vectori (Arrays)
Listele sunt foarte eficiente cnd se adug sau se terg elemente la nceputul lor, dar
accesul la celelalte elemente este ncet. Dac se dorete modificarea elementului de la sfritul unei
liste, trebuie clonat toat lista.
Vectorii sunt blocuri continue de memorie cu zero sau mai multe elemente, n care fiecare
element poate fi modificat individual, spre deosebire de liste, care sunt imutabile.
3.1. Funcii pentru crearea i accesarea elementelor
Ca i listele, vectorii pot fi creai n mai multe moduri, inclusiv prin array comprehensions:
> let array1 = [| 1; 2; 3 |] // [|1; 2; 3|]
> let array2 = [| 1 .. 10 |] // [|1; 2; 3; 4; 5; 6; 7; 8; 9; 10|]
> let array3 = [| 1 .. 2 .. 10 |] // [|1; 3; 5; 7; 9|]
> let array4 = [| for i in 1 .. 10 -> i * i |] // [|1; 4; 9; 16; 25; 36; 49; 64; 81; 100|]

Inteligenta artificiala - Laborator, http://florinleon.byethost24.com/lab_ia.htm

Inteligenta artificiala - Laborator, http://florinleon.byethost24.com/lab_ia.htm

let x = 0
let x_2 = x + 1

printfn "%d" array4.[2]


array4.[3] <- 17
printfn "%A" array4.[2..4]
printfn "%A" array4.[..3]
printfn "%A" array4.[3..]
printfn "%A" array4.[*]

//
//
//
//
//
//

9
atribuire
[|9; 17; 25|]
[|1; 4; 9; 17|]
[|17; 25; 36; 49; 64; 81; 100|]
[|1; 4; 9; 17; 25; 36; 49; 64; 81; 100|]

Dac indexul nu este valid, se genereaz excepia System.IndexOutOfRangeException.


3.2. Funcii specifice
Funcie

Descriere

blit

Copiaz un numr de elemente ncepnd cu un index dintr-un vector n alt vector ncepnd cu alt
index.
let a1 = [| 11 .. 15 |]
let a2 = Array.zeroCreate 10
// copiaza 3 elemente din a1, de la indexul 1 din a1, la indexul 2 din a2
Array.blit a1 1 a2 2 3 // a2 = [|0; 0; 12; 13; 14; 0; 0; 0; 0; 0|]

copy

Copiaz toate elementele unui vector n alt vector.


let a2 = Array.copy a1

create

Creeaz un vector ale crui elemente sunt iniializate cu o valoare dat.


let a = Array.create 5 1 // [|1; 1; 1; 1; 1|]

fill

Iniializeaz un grup de elemente dintr-un ir cu o valoare dat.


let a = Array.zeroCreate 10 // a = [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0|]
// seteaz 2 elemente n vectorul a, ncepnd cu indexul 3, la valoarea 1
Array.fill a 3 2 1 // a = [|0; 0; 0; 1; 1; 0; 0; 0; 0; 0|]

init

Creeaz un vector cu un numr de elemente specificat i iniializeaz elementele utiliznd o funcie.


let a = Array.init 5 (fun i -> i) // a = [|0; 1; 2; 3; 4|]

zeroCreate

Creeaz un ir cu un numr specificat de elemente i iniializeaz aceste elemente cu 0.


let a = Array.zeroCreate 3 // a = [|0; 0; 0|]

Spre deosebire de funciile de sortare de la liste, care returneaz alte liste ca rezultat,
funciile corespunztoare de la vectori modific elementele vectorului asupra cruia sunt aplicate.
Funcie

Descriere

sortInPlace

Sorteaz elementele unui vector, modificnd coninutul vectorului dat ca argument.


let a = [| 5 .. -1 .. 1 |] // a = [|5; 4; 3; 2; 1|]
Array.sortInPlace a // a = [|1; 2; 3; 4; 5|]

sortInPlaceBy

Sorteaz vectorul dup aplicarea unei funcii asupra elementelor.


let a = [|1; 4; 8; -2; 5|]
Array.sortInPlaceBy (fun elem -> abs elem) a // a = [|1; -2; 4; 5; 8|]

Inteligenta artificiala - Laborator, http://florinleon.byethost24.com/lab_ia.htm

Inteligenta artificiala - Laborator, http://florinleon.byethost24.com/lab_ia.htm

Elementul cu indexul i al unui vector a poate fi accesat cu sintaxa a.[i]. Indexarea pornete
de la 0. Elementele pot fi modificate. De asemenea, se poate accesa o anumit poriune dintr-un
vector, dup cum se poate vedea mai jos:

sortInPlaceWith Sorteaz vectorul utiliznd o funcie de comparaie definit de utilizator.

n F# exist i coleciile Array2D, Array3D i Array4D destinate lucrului cu matrice (vectori


multi-dimensionali). La fel ca n C#, exist matrice dreptunghiulare i zimate (engl. jagged).
ntr-o matrice dreptunghiular, toate liniile au acelai numr de elemente, de exemplu:
let m = Array2D.init 2 3 (fun x y -> x * 3 + y)
printfn "%A" m
printfn "%d" m.[1,2]
Rezultat:
[[0; 1; 2]
[3; 4; 5]]
5

ntr-o matrice zimat, liniile sunt iniializate independent i pot avea un numr diferit de
elemente (asemntor cu modul n care se iniializeaz matricele n C/C++):
let jagged = [| for a in 1 .. 5 -> [| 1 .. a |] |]
for x = 0 to jagged.Length - 1 do
for y = 0 to jagged.[x].Length - 1 do
printf "%d " jagged.[x].[y]
printfn ""
Rezultat:
1
12
123
1234
12345

4. Secvene
4.1. Evaluarea pasiv
Pn acum, codul creat a fost evaluat n mod activ (engl. eager). Cnd se definete de
exemplu o list, ea se creeaz efectiv n memorie, chiar dac nu o folosim ulterior. Exist ns
situaii n care dorim s evalum o expresie doar atunci cnd dorim. De exemplu, putem avea
nevoie s definim o secven foarte mare de date, dar dorim s se calculeze aceste valori doar n

Inteligenta artificiala - Laborator, http://florinleon.byethost24.com/lab_ia.htm

Inteligenta artificiala - Laborator, http://florinleon.byethost24.com/lab_ia.htm

Egalitatea coninutului a doi vectori se testeaz cu operatorul = .


Lista tuturor funciilor din modulul Array poate fi consultat n documentaia MSDN:
https://msdn.microsoft.com/en-us/visualfsharpdocs/conceptual/collections.array-module-%5Bfsharp%5D .

momentul n care le folosim efectiv. Acest mod de evaluare se numete pasiv sau ntrziat (engl.
lazy) i poate conduce la o scdere foarte mare a necesarului de memorie a unui program.
Cea mai des utilizat form de evaluare pasiv este prin utilizarea secvenelor. O secven
este un ir ordonat de elemente, asemntor unei liste. S considerm cteva exemple de iniializare:

> let seq2 = seq { for i in 1 .. 10 -> i * i };;


val seq2 : seq<int>

Spre deosebire de iniializarea listelor i vectorilor, se vede c aici n FSI nu apar valorile,
pentru c acestea nu au fost evaluate nc.
Elementele pot fi afiate cu ajutorul funciei Seq.iter:
> Seq.iter (printf "%d ") seq1;;
1 2 3 4 5 6 7 8 9 10

O secven poate fi parcurs n maniera dorit cu ajutorul funciei Seq.skip, care sare peste
un numr de elemente i Seq.take, care evalueaz un numr de elemente:
> let seq3 = Seq.skip 2 seq2;;
val seq3 : seq<int>
> Seq.take 4 seq3;;
val it : seq<int> = seq [9; 16; 25; 36]

Avnd n vedere evaluarea pasiv a unei secvene, este posibil definirea unor secvene
infinite. n exemplul urmtor, funcia Seq.initInfinite definete irul numerelor naturale. Din acest
ir, se evalueaz primele 10.
> let seqInfinite = Seq.initInfinite (fun n -> n + 1);;
val seqInfinite : seq<int>
> Seq.take 10 seqInfinite;;
val it : seq<int> = seq [1; 2; 3; 4; ...]

Parametrul n din expresia lambda merge de la 0 la infinit. Expresia definete termenul


corespunztor lui n. irul numerelor naturale ncepe de la 1, deci termenul corespunztor lui n = 0
este 0 + 1 = 1, termenul corespunztor lui n = 1 este 1 + 1 = 2 .a.m.d.
Pentru a vedea mai clar cnd se realizeaz evaluarea, s considerm urmtoarea secven de
cod:

Inteligenta artificiala - Laborator, http://florinleon.byethost24.com/lab_ia.htm

Inteligenta artificiala - Laborator, http://florinleon.byethost24.com/lab_ia.htm

> let seq1 = { 1 .. 10 };;


val seq1 : seq<int>

let seqBig = seq {


for i in 1 .. System.Int32.MaxValue do
printfn "In definitie: %d" i
yield i
}

printfn "Take 3"


let s2 = Seq.take 3 s1
printfn "Print"
Seq.iter (printfn "In iteratie: %d") s2

Rezultatul este prezentat mai jos. Se observ c valorile sunt evaluate doar atunci cnd este
nevoie: mai nti primele trei de care este nevoie pentru a ajunge la a patra i apoi urmtoarele,
nainte s fie afiate.
Skip 3
Take 3
Print
In definitie: 1
In definitie: 2
In definitie: 3
In definitie: 4
In iteratie: 4
In definitie: 5
In iteratie: 5
In definitie: 6
In iteratie: 6

Expresia unei secvene poate fi recursiv. Prin utilizarea cuvntului cheie yield! (yield
bang), se pot returna subsecvene, care vor fi introduse n ordine n secvena principal.
Urmtoarea funcie ntoarce toate fiierele dintr-un director i subdirectoarele acestuia:
open System.IO
let rec allFilesUnder basePath = seq {
yield! Directory.GetFiles(basePath) // toate fisierele din directorul de baza
for subdir in Directory.GetDirectories(basePath) do
yield! allFilesUnder subdir // toate fisierele din subdirectoare
}
Seq.iter (printfn "%A") (allFilesUnder """d:\""")

Inteligenta artificiala - Laborator, http://florinleon.byethost24.com/lab_ia.htm

Inteligenta artificiala - Laborator, http://florinleon.byethost24.com/lab_ia.htm

printfn "Skip 3"


let s1 = Seq.skip 3 seqBig

Funcie

Descriere

countBy

Aplic o funcie care atribuie o cheie fiecrui tip de element al unei secvene i returneaz o secven
care include tipurile gasite i numrul elementelor de fiecare tip din secvena original. Aceast funcie
se bazeaz pe traversarea secvenei, prin urmare nu trebuie folosit pentru secvene lungi sau infinite.
let seq1 = seq { -10 .. 10 }
let seq2 = Seq.countBy (fun elem -> if elem < 0 then -1 elif elem % 2 = 0 then 0 else 1) seq1
printfn "%A" seq2 // seq [(-1, 10); (0, 6); (1, 5)]

distinct

Returneaz o secven care nu conine elemente duplicate.


let seq1 = seq { for i in -5 .. 5 -> i *i }
Seq.iter (fun e -> printf "%d " e) seq1; printfn "" // 25 16 9 4 1 0 1 4 9 16 25
let seq2 = Seq.distinct seq1
Seq.iter (fun e -> printf "%d " e) seq2 // 25 16 9 4 1 0

skipWhile

Returneaz secvena original din care sunt excluse primele elementele care ndeplinesc condiiile
specificate prin funcia definit de utilizator.
let seq1 = seq { for i in 1 .. 10 -> i *i }
Seq.iter (fun e -> printf "%d " e) seq1; printfn "" // 1 4 9 16 25 36 49 64 81 100
let seq2 = Seq.skipWhile (fun x -> x < 50) seq1
Seq.iter (fun e -> printf "%d " e) seq2 // 64 81 100

takeWhile

Returneaz elementele din secvena iniial care ndeplinesc condiiile specificate prin funcia definit
de utilizator.
let seq1 = seq { for i in 1 .. 10 -> i *i } // seq1 = 1 4 9 16 25 36 49 64 81 100
let seq2 = Seq.takeWhile (fun x -> x < 50) seq1 // 1 4 9 16 25 36 49

truncate

Returneaz o secven care include primele n elemente din secvena iniial.


let seq1 = seq { for i in 1 .. 10 -> i *i } // seq1 = 1 4 9 16 25 36 49 64 81 100
let seq2 = Seq.truncate 3 seq1 // 1 4 9

windowed

Returneaz o secven de ferestre, fiecare cu un numr specificat de elemente, mergnd din element n
element. Fiecare fereastr este returnat ca un vector nou.
let seq1 = seq { for i in 0..2..8 -> i *i } // seq1 = 0 4 16 36 64
let windows = Seq.windowed 3 seq1
Seq.iter (fun e -> printf "%A " e) windows; printfn "" // [|0; 4; 16|] [|4; 16; 36|] [|16; 36; 64|]
let movingAverage = Seq.map (fun a -> Array.averageBy (fun e -> float e) a) windows
Seq.iter (fun e -> printf "%.2f " e) movingAverage // 6.67 18.67 38.67

Lista tuturor funciilor din modulul Seq poate fi consultat n documentaia MSDN:
https://msdn.microsoft.com/en-us/visualfsharpdocs/conceptual/collections.seq-module-%5Bfsharp%5D .

5. Conversii ntre colecii


n toate modulele coleciilor exist funcii pentru conversia din/n alte tipuri de colecii.
Aceste funcii au forma X.ofY, nsemnnd conversia tipului Y n tipul X, i X.toY, nsemnnd
conversia tipului X n tipul Y.

Inteligenta artificiala - Laborator, http://florinleon.byethost24.com/lab_ia.htm

Inteligenta artificiala - Laborator, http://florinleon.byethost24.com/lab_ia.htm

4.2. Funcii specifice

n modulele List, Array i Seq exist urmtoarele funcii de conversie: List.ofArray,


List.ofSeq, List.toArray, List.toSeq, Array.ofList, Array.ofSeq, Array.toList, Array.toSeq, Seq.ofArray,
Seq.ofList, Seq.toArray i Seq.toList.
Exemplul urmtor utilizeaz funcia List.ofArray, reprezentnd conversia unui vector ntr-o
list:

n coleciile Map i Set, pe care le vom prezenta n seciunea 6, exist urmtoarele funcii de
conversie: Map.ofArray, Map.ofList, Map.ofSeq, Map.toArray, Map.toList, Map.toSeq, Set.ofArray,
Set.ofList, Set.ofSeq, Set.toArray, Set.toList, Set.toSeq.

6. Alte colecii
6.1. Map
Colecia Map reprezint tabele hash imutabile. Mai jos sunt descrise cteva funcii specifice:
Funcie

Descriere

add

Adaug un element nou n tabel. Dac se adaug un element cu o cheie existent, valoarea este nlocuit.
let m1 = Map.ofList [ (1, "unu"); (2, "doi") ]
let m2 = Map.add 3 "trei" m1
Map.iter (fun key value -> printfn "Cheie: %d, valoare: %s" key value) m2
Rezultate:
Cheie: 1, valoare: unu
Cheie: 2, valoare: doi
Cheie: 3, valoare: trei

containsKey

Testeaz dac o cheie exist n tabel i returneaz true sau false.

find

Caut un element n tabel. Dac cheia nu exist, se arunc o excepie.


let m = Map.ofList [ (1, "unu"); (2, "doi") ]
let e1 = 1; printfn "Valoarea cu cheia %d este: %s" e1 (Map.find e1 m) // Valoarea cu cheia 1 este: unu
let e2 = 3; printfn "Valoarea cu cheia %d este: %s" e2 (Map.find e2 m) // KeyNotFoundException

findKey

Returneaz prima cheie pentru care predicatul este satisfcut. Dac nu exist nicio astfel de cheie, se
arunc o excepie.
let m = Map.ofList [ (1, "unu"); (2, "doi"); (3, "trei") ]
printfn "%A" (Map.findKey (fun key value -> key >= 2) m) // 2

remove

Elimin un element din tabel. n cazul n care elementul nu exist, nu apare nicio excepie.

Lista tuturor funciilor din modulul Map poate fi consultat n documentaia MSDN:
https://msdn.microsoft.com/en-us/visualfsharpdocs/conceptual/collections.map-module-%5Bfsharp%5D .

Inteligenta artificiala - Laborator, http://florinleon.byethost24.com/lab_ia.htm

Inteligenta artificiala - Laborator, http://florinleon.byethost24.com/lab_ia.htm

let line = System.Console.ReadLine() // "1 2 3"


let listOfStrings = List.ofArray (line.Split()) // ["1"; "2"; "3"]
let listOfInts = List.map (fun x -> int x) listOfStrings // [1; 2; 3]

5.3. Set

Funcia

Descriere

contains

Returneaz true dac mulimea conine elementul specificat i false altfel.


let s = Set.ofList [1;2;3]
printfn "%b" (Set.contains 2 s) // true

count

Returneaz numrul de elemente din mulime.

difference

Returneaz o nou mulime format din elementele primei mulimi din care s-au eliminat
elementele celei de-a doua.
let s1 = Set.ofList [1;2;3]
let s2 = Set.ofList [2;3;4]
printfn "%A" (Set.difference s1 s2) // set [1]

intersect

Returneaz intersecia a dou mulimi.


printfn "%A" (Set.intersect s1 s2) // set [2; 3]

intersectMany

Returneaz intersecia unei secvene de mulimi.


let seqOfSets = seq { for i in 1 .. 9 -> Set.ofList [ i .. i .. 10000 ] }
let setResult = Set.intersectMany seqOfSets
printfn "Numerele intre 1 si 10000 divizibile cu toate numerele de la 1 la 9:"
printfn "%A" setResult // set [2520; 5040; 7560]

isProperSubset

Returneaz true dac toate elementele din prima mulime sunt n cea de-a doua i cel puin un
element din a doua mulime nu este n prima mulime.
let set1 = Set.ofList [ 1 .. 6 ]
let set2 = Set.ofList [ 1 .. 5 ]
let set3 = Set.ofList [ 1 .. 6 ]
printfn "%b" (Set.isProperSubset set2 set1) // true
printfn "%b" (Set.isProperSubset set3 set1) // false

isProperSuperset

Returneaz true dac toate elementele din a doua mulime sunt n prima mulime i cel puin un
element din prima mulime nu este n a doua.

isSubset

Returneaz true dac toate elementele din prima mulime sunt n a doua mulime.
printfn "%b" (Set.isSubset set2 set1) // true, cu mulimile set1, set2 i set3 de la isProperSubset
printfn "%b" (Set.isSubset set3 set1) // true

isSuperset

Returneaz true dac toate elementele din a doua mulime sunt n prima mulime.

maxElement

Returneaz cel mai mare element din mulime.

minElement

Returneaz cel mai mic element din mulime.

singleton

Returneaz o mulime cu un singur element.


let s = Set.singleton 1 // s = set [1]

union

Returneaz reuniunea a dou mulimi.

unionMany

Returneaz reuniunea unei secvene de mulimi.

Lista tuturor funciilor din modulul Set poate fi consultat n documentaia MSDN:
https://msdn.microsoft.com/en-us/visualfsharpdocs/conceptual/collections.set-module-%5Bfsharp%5D .

Inteligenta artificiala - Laborator, http://florinleon.byethost24.com/lab_ia.htm

Inteligenta artificiala - Laborator, http://florinleon.byethost24.com/lab_ia.htm

Colecia Set reprezint mulimi imutabile. Mai jos sunt descrise cteva funcii specifice:

6. Comparaie
Imutabil

Caracteristici

Da

Avantaje:
Posibilitatea aplicrii potrivirii modelelor (engl. pattern matching);
Posibilitatea crerii unor iteraii complexe prin recursivitate;
Prelucrare rapid a primului element;
Dezavantaje:
Accesul indexat i alte tipuri de accesare ale elementelor sunt lente.

Nu

Alias pentru tipul .NET Array


Avantaje:
Acces indexat rapid;
Eficien n utilizarea memoriei;
Posibilitatea utilizrii bibliotecilor .NET care folosesc tipul Array;
Posibilitatea de a lucra cu vectori/matrice 2D, 3D i 4D;
Dezavantaje:
Pattern matching limitat.

Seq

Da

Alias pentru tipul .NET IEnumerable


Avantaje:
Evaluare pasiv/ntrziat;
Eficien n utilizarea memoriei, numai elementul curent este ncrcat;
Posibilitatea reprezentrii de secvene infinite;
Posibilitatea utilizrii cu bibliotecilor .NET care folosesc tipul IEnumerable;
Dezavantaje:
Imposibilitatea aplicrii pattern matching;
Accesul indexat sau alte tipuri de acces sunt lente.

Map

Da

Dicionar imutabil. Necesit chei pentru a implementa interfaa IComparable.

Set

Da

Mulime imutabil. Necesit elemente pentru a implementa interfaa IComparable.

ResizeArray

Nu

Alias pentru tipul .NET List. Avantajele i dezavantajele sunt similare cu ale
vectorilor, dar listele sunt redimensionabile.

List

Array

7. Aplicaii
7.1. S se realizeze un program care calculeaz valoarea real a unei fracii continue. O
fracie continu este o expresie obinut n urma unui proces iterativ de reprezentare a unui numr
ca suma unor numere ntregi i inverse ale unor ntregi, de forma:
= +

1
+ +

= , , , ,

unde i , 1.
Avnd n vedere tema laboratorului, rezolvai mai nti problema cu o bucl for.
Rezolvai-o apoi i n mod funcional, folosind funcia Array.fold.

10

Inteligenta artificiala - Laborator, http://florinleon.byethost24.com/lab_ia.htm

Inteligenta artificiala - Laborator, http://florinleon.byethost24.com/lab_ia.htm

Colecie

Exemplu:
let mainP1() =
printfn "Valoarea lui pi este:\t%A" System.Math.PI
printfn "Valoarea fractiei este:\t%A" (contFraction [| 3; 7; 15 |])
printfn "Valoarea fractiei este:\t%A" (contFraction [| 3; 7; 15; 1; 292; 1 |])

Valoarea lui pi este: 3.141592654


Valoarea fractiei este: 3.141509434
Valoarea fractiei este: 3.141592654

7.2. Funcia exponenial poate fi calculat cu ajutorul unei serii Taylor:


=
+ + + +
!
0! 1! 2! 3!

Definii o secven infinit ai crei termeni corespund termenilor seriei de mai sus. Realizai
o funcie care aproximeaz funcia exponenial cu o precizie dorit, precizia nsemnnd n acest
caz faptul c termenii seriei mai mici dect aceast valoare sunt ignorai.
Indicaie: Pentru definirea secvenei infinite, observai c termenul generic corespunztor lui
n poate fi scris recursiv:

=
! ( 1)!
Funcia principal poate fi urmtoarea:
let mainP2() =
let x = 2.0
let p = 1e-5
// x este exponentul iar p este precizia
printfn "Serie:\t%.6f" (exp' x p)
printfn "Exact:\t%.6f" (exp x)

Rezultate:
Serie: 7.389046
Exact: 7.389056

11

Inteligenta artificiala - Laborator, http://florinleon.byethost24.com/lab_ia.htm

Inteligenta artificiala - Laborator, http://florinleon.byethost24.com/lab_ia.htm

Rezultate:

7.3. Implementai o funcie de nmulire a dou matrice bidimensionale.

let mainP3() =
let rand = System.Random()
let a = Array2D.init 2 3 (fun x y -> rand.Next(10))
let b = Array2D.init 3 4 (fun x y -> rand.Next(10))
let c = multiply a b
printfn "A = \n%A\n\nB = \n%A\n\nA * B = \n%A" a b c
let d = multiply b a
printfn "\nB * A = \n%A" d

Dac matricele nu au dimensiuni compatibile, se va returna o matrice cu un singur element


cu valoarea 0. Acest caz poate fi tratat mai elegant folosind alte tehnici pe care le vom prezenta n
laboratoarele viitoare. Numrul de linii al unei matrice bidimensionale a se poate determina cu
metoda a.GetLength(0), iar numrul de coloane cu metoda a.GetLength(1). Pseudocodul pentru
nmulire este:
for i = 1 to n
for j = 1 to p
for k = 1 to m
c[i, j] += a[i, k] * b[k, j]

Exemplu:
A=
[[8; 4; 4]
[7; 9; 5]]
B=
[[6; 4; 5; 1]
[4; 9; 0; 9]
[4; 2; 6; 0]]
A*B=
[[80; 76; 64; 44]
[98; 119; 65; 88]]
B*A=
[[0]]

12

Inteligenta artificiala - Laborator, http://florinleon.byethost24.com/lab_ia.htm

Inteligenta artificiala - Laborator, http://florinleon.byethost24.com/lab_ia.htm

Indicaii: Funcia principal poate fi urmtoarea:

S-ar putea să vă placă și