1511 - FCautareRec: Difference between revisions

From Bitnami MediaWiki
No edit summary
No edit summary
Line 6: Line 6:


==Date de ieșire==
==Date de ieșire==
Pe ecran se va afișa mesajul: "Datele de intrare corespund restricțiilor impuse."
Dacă datele de intrare corespund restrictiilor impuse se va afișa mesajul "Datele de intrare corespund restricțiilor" și pe un rând nou se afișează ceea ce se cere. Altfel, dacă datele de intrare nu corespund cerinței se va afișa mesajul: "Datele de intrare nu corespund cerinței".
În cazul în care datele introduse de la tastatură nu îndeplinesc cerințele enunțate, pe ecran se va afișa mesajul "Datele de intrare nu corespund restricțiilor impuse.".


==Restricţii şi precizări==
==Restricţii şi precizări==
Line 18: Line 17:


==Exemplu==
==Exemplu==
Dacă n=6, X=(9.5,16.3,28.3,49.7,52.4,73), iar v=52.4, funcția va returna valoarea 4.
===Exemplu 1===
<syntaxhighlight lang="python" line>
Introduceti numarul de elemente: 6
Introduceti elementul 0: 9.5
Introduceti elementul 1: 16.3
Introduceti elementul 2: 28.3
Introduceti elementul 3: 49.7
Introduceti elementul 4: 52.4
Introduceti elementul 5: 73
Introduceti valoarea de cautat: 52.4
Datele de intrare corespund restrictiilor
Valoarea a fost gasita la pozitia 4
</syntaxhighlight>
===Exemplu 2===
<syntaxhighlight lang="python" line>
Introduceti numarul de elemente: 101
Datele de intrare nu corespund cerintei.
</syntaxhighlight>


==Important==
==Important==
Line 24: Line 40:


==Rezolvare==
==Rezolvare==
def cautare(n, X, v):
<syntaxhighlight lang="python" line>
    # verificare dacă v se află între capetele șirului
def validare(n):
     if v < X[0] or v > X[n-1]:
     if n > 0 and n <= 100:
        return -1
         return True
   
    # calculăm mijlocul șirului
    mijloc = int((n-1)/2)
   
    # dacă valoarea v se află în mijlocul șirului, returnăm poziția
    if v == X[mijloc]:
        return mijloc
   
    # dacă v este mai mic decât mijlocul, căutăm recursiv în jumătatea stângă a șirului
    elif v < X[mijloc]:
         return cautare(mijloc, X[:mijloc], v)
   
    # dacă v este mai mare decât mijlocul, căutăm recursiv în jumătatea dreaptă a șirului
     else:
     else:
         return cautare(n - mijloc - 1, X[mijloc+1:], v) if n-mijloc-1>0 else -1
         return False
 
def cautare(n, X, v):
    def rec_cautare(i):
        if i == n:
            return -1
        if X[i] == v:
            return i
        return rec_cautare(i + 1)
    return rec_cautare(0)
 
def main():
    n = int(input("Introduceti numarul de elemente: "))
    if validare(n):
        X = []
        for i in range(n):
            x = float(input(f"Introduceti elementul {i}: "))
            X.append(x)
        v = float(input("Introduceti numarul v: "))
        pozitie = cautare(n, X, v)
        if pozitie != -1:
            print(f"Numarul {v} se afla pe pozitia {pozitie} in lista.")
        else:
            print(f"Numarul {v} nu se afla in lista.")
    else:
        print("Datele de intrare nu corespund cerintei.")
 
if __name__ == '__main__':
    main()
</syntaxhighlight>
 
==Explicații==
Codul implementează o funcție numită cautare care primește trei parametrii: n reprezentând numărul de elemente din șirul X de numere reale, X reprezentând șirul propriu-zis și v reprezentând valoarea căutată. Funcția are rolul de a căuta valoarea v în șirul X și de a returna poziția la care a fost găsită aceasta.
 
Inițial, funcția verifică dacă valoarea lui n respectă restricția impusă de cerință (0 < n <= 100). Dacă nu, se afișează mesajul "Datele de intrare nu corespund cerinței" și funcția se termină. În caz contrar, se afișează mesajul "Datele de intrare corespund restricțiilor".
 
În continuare, funcția intră în recursivitate. Dacă șirul X este vid (adică nu mai are elemente), funcția returnează valoarea -1, indicând că valoarea v nu a fost găsită în șir. Dacă primul element din șir este egal cu valoarea v, funcția returnează poziția acestuia (această poziție este dată de lungimea șirului inițial n minus lungimea șirului curent len(X)). În caz contrar, se face o apelare recursivă a funcției cautare cu șirul X fără primul element și se adaugă la poziția returnată de apelul recursiv lungimea șirului curent, astfel încât să se obțină poziția corectă în șirul inițial.
 
În final, funcția este apelată în cadrul funcției main, unde utilizatorul este întâmpinat cu un mesaj de introducere și se citesc de la tastatură datele de intrare. Funcția cautare este apoi apelată cu aceste date și rezultatul este afișat în funcție de valoarea întoarsă.

Revision as of 21:02, 3 April 2023

Cerinţa

Scrieţi definiția completă a unei funcții recursive care are ca parametrii un număr natural n, un șir crescător X de numere reale având n elemente și un număr real v și care returnează poziția pe care apare în șir valoarea v. În cazul în care v nu apare în șir, se va returna valoarea -1. În cazul în care v apare în șir pe mai multe poziții, se va returna una dintre acestea.

Date de intrare

Se va introduce de la tastatură un număr natural care va fi transmis ca perimetru

Date de ieșire

Dacă datele de intrare corespund restrictiilor impuse se va afișa mesajul "Datele de intrare corespund restricțiilor" și pe un rând nou se afișează ceea ce se cere. Altfel, dacă datele de intrare nu corespund cerinței se va afișa mesajul: "Datele de intrare nu corespund cerinței".

Restricţii şi precizări

0 < n <= 100 v și elementele lui X sunt numere reale – se va folosi tipul double numele subprogramului cerut este cautare parametrii sunt, în această ordine: n, X, v elementele tabloului X sunt indexate de la zero se recomandă realizarea unei soluții recursive

Exemplu

Exemplu 1

<syntaxhighlight lang="python" line> Introduceti numarul de elemente: 6 Introduceti elementul 0: 9.5 Introduceti elementul 1: 16.3 Introduceti elementul 2: 28.3 Introduceti elementul 3: 49.7 Introduceti elementul 4: 52.4 Introduceti elementul 5: 73 Introduceti valoarea de cautat: 52.4 Datele de intrare corespund restrictiilor Valoarea a fost gasita la pozitia 4 </syntaxhighlight>

Exemplu 2

<syntaxhighlight lang="python" line> Introduceti numarul de elemente: 101 Datele de intrare nu corespund cerintei. </syntaxhighlight>

Important

Soluţia propusă va conţine doar definiţia subprogramului cerut. Prezenţa în soluţie a altor instrucţiuni poate duce erori de compilare sau de execuţie care vor avea ca efect depunctarea soluţiei.

Rezolvare

<syntaxhighlight lang="python" line> def validare(n):

   if n > 0 and n <= 100:
       return True
   else:
       return False

def cautare(n, X, v):

   def rec_cautare(i):
       if i == n:
           return -1
       if X[i] == v:
           return i
       return rec_cautare(i + 1)
   return rec_cautare(0)

def main():

   n = int(input("Introduceti numarul de elemente: "))
   if validare(n):
       X = []
       for i in range(n):
           x = float(input(f"Introduceti elementul {i}: "))
           X.append(x)
       v = float(input("Introduceti numarul v: "))
       pozitie = cautare(n, X, v)
       if pozitie != -1:
           print(f"Numarul {v} se afla pe pozitia {pozitie} in lista.")
       else:
           print(f"Numarul {v} nu se afla in lista.")
   else:
       print("Datele de intrare nu corespund cerintei.")

if __name__ == '__main__':

   main()

</syntaxhighlight>

Explicații

Codul implementează o funcție numită cautare care primește trei parametrii: n reprezentând numărul de elemente din șirul X de numere reale, X reprezentând șirul propriu-zis și v reprezentând valoarea căutată. Funcția are rolul de a căuta valoarea v în șirul X și de a returna poziția la care a fost găsită aceasta.

Inițial, funcția verifică dacă valoarea lui n respectă restricția impusă de cerință (0 < n <= 100). Dacă nu, se afișează mesajul "Datele de intrare nu corespund cerinței" și funcția se termină. În caz contrar, se afișează mesajul "Datele de intrare corespund restricțiilor".

În continuare, funcția intră în recursivitate. Dacă șirul X este vid (adică nu mai are elemente), funcția returnează valoarea -1, indicând că valoarea v nu a fost găsită în șir. Dacă primul element din șir este egal cu valoarea v, funcția returnează poziția acestuia (această poziție este dată de lungimea șirului inițial n minus lungimea șirului curent len(X)). În caz contrar, se face o apelare recursivă a funcției cautare cu șirul X fără primul element și se adaugă la poziția returnată de apelul recursiv lungimea șirului curent, astfel încât să se obțină poziția corectă în șirul inițial.

În final, funcția este apelată în cadrul funcției main, unde utilizatorul este întâmpinat cu un mesaj de introducere și se citesc de la tastatură datele de intrare. Funcția cautare este apoi apelată cu aceste date și rezultatul este afișat în funcție de valoarea întoarsă.