1511 - FCautareRec

From Bitnami MediaWiki
Revision as of 11:19, 25 March 2023 by Catalin Moje (talk | contribs)

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

Pe ecran se va afișa mesajul: "Datele de intrare corespund restricțiilor impuse." Î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

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

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.

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

def cautare(n, X, v):
   # verificare dacă v se află între capetele șirului
   if v < X[0] or v > X[n-1]:
       return -1
   
   # 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:
       return cautare(n - mijloc - 1, X[mijloc+1:], v) if n-mijloc-1>0 else -1