Sunteți pe pagina 1din 28

Limbaje de programare I

CURS 4

Limbaje de programare 1 1
LOOPS (recapitulare)

Limbaje de programare 1 2
STRINGS (recapitulare)
• Este o secvență de caractere
• Se pot compara string-uri cu ==, >, < etc.
• len() este o funcție care returnează lungimea șirului din
paranteze
• Parantezele pătrate se folosesc pentru a realiza indexarea
pentru accesarea valorii de la un anumit index/poziție
s = "abc”
index: 0 1 2 (indexarea începe întotdeauna de la 0)

len(s) → returnează 3
s[0] → returnează "a"
s[1] → returnează "b"
s[3] → încearcă indexarea în afara limitelor, eroare

Limbaje de programare 1 3
• Se pot împărți string-urile folosind [start:stop:step]
s = "abcdefgh"
s[::-1] → returnează "hgfedcba"
s[3:6] → returnează "def"
s[-1] → returnează "h"
• String-urile sunt “immutable” – nu pot fi modificate
s = "hello"
s[0] = 'y' → va da eroare
s = 'y'+s[1:len(s)] → este permis
s este un nou obiect

Limbaje de programare 1 4
FOR LOOPS (recapitulare)
• Buclele for au o variabilă care iterează după un set de valori
for var in range(4):
<expressions>
– var iterează după valorile 0,1,2,3
– Expressions din loop se execută pentru fiecare valoare a lui var
for var in range(4,8):
<expressions>
– var iterează după valorile 4,5,6,7
• range este o modalitate de a itera după numere, dar
variabila unei bucle for, poate itera după orice set de valori,
nu numai numere!

Limbaje de programare 1 5
STRING-uri și LOOP-uri

Limbaje de programare 1 6
Limbaje de programare 1 7
Aproximarea soluțiilor
• Să presupunem că vrem să găsim rădăcina
oricărui număr pozitiv.
• Nu putem garanta soluția exactă, dar căutăm
o soluție cât mai aproape de aceasta
• Începem cu enumerarea exhaustivă
– Prin pași mici generăm în ordine soluții posibile
– Verificăm dacă este soluția destul de aproape

Limbaje de programare 1 8
Aproximarea soluțiilor
• Soluția este destul de bună?
• Începem cu o ghicire și incrementăm cu o
valoare mică
• |guess3|-cube <= epsilon
pentru epsilon suficient de mic
• Scădem incrementul → program mai lent
• Creștem epsilon → soluție mai puțin exactă

Limbaje de programare 1 9
Aproximarea soluțiilor –
rădăcina cubică

Limbaje de programare 1 10
Observații
• Pasul poate fi orice număr mic
– Dacă este prea mic, ia mult timp găsirea soluției
– Dacă este prea mare, poate trece peste soluție
fără a ajunge suficient de aproape de aceasta
• În general, se va trece de x/step ori prin cod
până la găsirea soluției
• Este necesar un mod mai eficent de a rezolva
o asemenea problemă

Limbaje de programare 1 11
Căutarea binară
• Știm că rădăcina pătrată a lui x este între 1 și x
• Decât să încercăm să căutăm soluția începând
de la 1, mai bine alegem un număr din
mijlocul acestui interval

• Dacă avem noroc, acesta este destul de


aproape de soluție
Limbaje de programare 1 12
Căutarea binară
• Dacă nu suntem destul de aproape, este numărul ales
prea mare sau prea mic?
• Dacă g**2 > x, atunci știm că g este prea mare și acum
căutăm

• Și dacă, de exemplu, acest nou g (new g) este g**2 < x,


atunci este prea mic și căutăm din nou

• La fiecare pas, se reduce la jumătate domeniul de


valori în care se caută
Limbaje de programare 1 13
Exemplu de rădăcină pătrată

Limbaje de programare 1 14
Exemplu de rădăcină cubică

Limbaje de programare 1 15
Căutare binară – convergența
• Spațiul de căutare
• search space
– Prima alegere: N/2
– A doua alegere: N/4
– Alegerea g: N/2g
• Căutarea converge de ordinul a log2N pași
• Căutarea binară funcționează atunci când valoarea funcției variază
monoton cu intrarea
• Codul prezentat funcționează numai pentru cuburi pozitive > 1 (de
ce?)
• Teme
– Modificați codul pentru a funcționa și cu numere negative
– Modificați codul pentru a funcționa și cu numere x < 1

Limbaje de programare 1 16
x<1
• Dacă x < 1, spațiul de căutare este de la 0 la x,
dar rădăcina cubică este mai mare ca x și mai
mică decât 1
• Modificați codul pentru a alege spațiul de
căutare în funcție de valoarea lui x

Limbaje de programare 1 17
Observații
• Căutarea binară reduce drastic timpul de
calcul – este importantă alegerea inteligentă a
variantelor de soluții
• Ar trebui să funcționeze bine pe probleme cu
proprietatea de ”ordonare” – valoarea funcției
rezolvate variază simultan, cu valoarea de
intrare
– Aici funcția este g**2, care crește când g crește

Limbaje de programare 1 18
FLOAT
• Float aproximează numerele reale și este util
să înțelegem cum
• Numere zecimale:
– 302 = 3*102 + 0*101 + 2*100
• Numere binare:
– 10011 = 1*24 + 0*23 + 0*22 + 1*21 + 1*20
– (care în zecimal este 16 + 2 + 1 = 19)
• Intern, computerul reprezintă numerele în
binar
Limbaje de programare 1 19
Conversia întregilor zecimali în binar
• Se consideră exemplul:
– x = 1*24 + 0*23 + 0*22 + 1*21 + 1*20 = 10011
• Dacă luăm resturile împărțirii la 2 (x%2) ale
acestui număr, acestea vor fi ultimul bit binar
• Dacă apoi împărțim pe x la 2 (x//2), toți biții
sunt translatați spre dreapta
– x//2 = 1*23 + 0*22 + 0*21 + 1*20 = 1001
• Se realizează succesiv împărțirile de mai sus,
obținând pe rând biții
Limbaje de programare 1 20
Conversia în Python

Limbaje de programare 1 21
Conversia fracțiilor
• 3/8 = 0.375 = 3*10-1 + 7*10-2 + 5*10-3
• Dacă înmulțim cu o putere a lui 2 destul de
mare încât să obținem un număr întreg,
acesta se poate apoi converti în binar, și apoi
se împarte de puterea lui 2
• 0.375 * (2**3) = 3 (zecimal)
• Convertim pe 3 în binar (obținem 11)
• Împărțim prin 2**3 (translație la dreapta) și
obținem 0.011 (binar)
Limbaje de programare 1 22
Limbaje de programare 1 23
Observații
• Dacă nu există niciun întreg p a.î. x*(2**p) să fie
un număr întreg, atunci reprezentarea internă va
fi o aproximare
• Testarea egalității numerelor reale (float) nu este
exactă
– Se folosește abs(x-y) < un număr mic, decât x == y
• De ce print(0.1) ne returnează 0.1, dacă nu este
exact?
– Deoarece proiectanții Python l-au setat să rotunjească
automat

Limbaje de programare 1 24
NEWTON-RAPHSON
• Algoritmul general de aproximare pentru a găsi
rădăcinile unui polinom de o variabilă
p(x) = anxn + an-1xn-1 + … + a1x + a0
• Dorim să găsim pe r a.î. p(r) = 0
• De exemplu, să găsim rădăcina pătrată a lui 24, ca
rădăcină a lui p(x) = x2 – 24
• Newton a arătat că dacă g este o aproximare a
rădăcinii, atunci
g – p(g)/p’(g)
este o aproximare mai bună, unde p’ este derivata lui p

Limbaje de programare 1 25
NEWTON-RAPHSON
• Un caz simplu: cx2 + k
• Derivata de ordinul 1: 2cx
• Așadar, dacă polinomul este x2 - k, atunci
derivata este 2x
• Newton-Raphson spune că având o alegere g
ca rădăcină, o alegere mai bună este
g – (g2 –k)/2g

Limbaje de programare 1 26
NEWTON-RAPHSON

Limbaje de programare 1 27
Algoritmi iterativi
• Metodele ”ghicește și verifică” sunt construite
pe reutilizarea aceluiași cod:
– Folosesc o constucție iterativă pentru a genera
alegeri, apoi verifică și continuă
• Alegerea
– Enumerare exhaustivă
– Căutare binară
– Newton-Raphson (pentru găsirea rădăcinii)

Limbaje de programare 1 28

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