1842 - CreareNumarRec: Difference between revisions
Pagină nouă: == Cerinţa == Scrieți definiția completă a subprogramului recursiv F, care primește prin intermediul parametrului n un număr natural nenul (1≤n≤9), iar prin intermediul parametrului a, un tablou unidimensional care conţine n valori naturale, fiecare dintre acestea reprezentând câte o cifră a unui număr. Astfel, a0 reprezintă prima cifră a numărului, a1 a doua cifră, etc. Subprogramul furnizează prin parametrul k o valoare naturală egală cu numărul obţ... |
No edit summary |
||
Line 14: | Line 14: | ||
Dacă n=6 și a= (2, 3, 5, 6, 4, 1), după apel k=264. | Dacă n=6 și a= (2, 3, 5, 6, 4, 1), după apel k=264. | ||
== | == Explicație == | ||
Funcția <code>F</code> primește trei argumente: | |||
* <code>n</code> - un număr întreg pozitiv, reprezentând numărul de elemente din lista <code>a</code> | |||
* <code>a</code> - o listă de numere întregi, având lungimea <code>n</code> | |||
* <code>k</code> - un număr întreg, inițial -1 | |||
Funcția începe prin a verifica cazul de bază <code>n == 0</code>, caz în care returnează valoarea lui <code>k</code>. | |||
În caz contrar, verifică dacă ultimul element din lista <code>a</code> este un număr par (<code>a[n-1] % 2 == 0</code>). Dacă este par, verifică dacă <code>k</code> este -1, caz în care atribuie lui <code>k</code> valoarea elementului respectiv din lista <code>a</code>. În caz contrar, concatenază valoarea elementului din lista <code>a</code> cu <code>k</code>, transformând <code>k</code> într-un număr format din două sau mai multe cifre. | |||
În final, funcția se autoapelează cu parametrii <code>n-1</code>, <code>a</code> și <code>k</code> și returnează valoarea rezultată de această apelare. | |||
== Rezolvare == | == Rezolvare == | ||
<syntaxhighlight lang="python"> | <syntaxhighlight lang="python"> | ||
def validate_n(n): | |||
if isinstance(n, int) and 0 < n < 10: | |||
return True | |||
return False | |||
def validate_a(a): | |||
if isinstance(a, list) and all(isinstance(x, int) for x in a) and len(a) == 10: | |||
return True | |||
return False | |||
def validate_k(k): | |||
if isinstance(k, int): | |||
return True | |||
return False | |||
def F(n, a, k): | def F(n, a, k): | ||
if n == 0: | if n == 0: | ||
Line 28: | Line 53: | ||
k = int(str(a[n-1]) + str(k)) | k = int(str(a[n-1]) + str(k)) | ||
return F(n-1, a, k) | return F(n-1, a, k) | ||
def main(): | |||
n = input("Introduceți un număr întreg pozitiv n (0 < n < 10): ") | |||
try: | |||
n = int(n) | |||
if validate_n(n): | |||
a = [] | |||
for i in range(10): | |||
elem = input(f"Introduceți elementul a[{i}]: ") | |||
elem = int(elem) | |||
a.append(elem) | |||
if validate_a(a): | |||
k = -1 | |||
result = F(n, a, k) | |||
if validate_k(result): | |||
print(f"Rezultatul este: {result}") | |||
else: | |||
print("Nu s-a putut calcula rezultatul.") | |||
else: | |||
print("Lista a nu este validă.") | |||
else: | |||
print("Numărul introdus nu este valid.") | |||
except ValueError: | |||
print("Nu ați introdus un număr întreg.") | |||
</syntaxhighlight> | </syntaxhighlight> |
Revision as of 13:49, 6 April 2023
Cerinţa
Scrieți definiția completă a subprogramului recursiv F, care primește prin intermediul parametrului n un număr natural nenul (1≤n≤9), iar prin intermediul parametrului a, un tablou unidimensional care conţine n valori naturale, fiecare dintre acestea reprezentând câte o cifră a unui număr. Astfel, a0 reprezintă prima cifră a numărului, a1 a doua cifră, etc.
Subprogramul furnizează prin parametrul k o valoare naturală egală cu numărul obţinut din cifrele pare memorate în tabloul a sau valoarea -1 dacă în tablou nu există nicio cifră pară.
Restricţii şi precizări
- 0 < n < 10
- Numele subprogramului cerut este F
- Parametrii sunt, în această ordine: n, a, k
- Elementele vectorului a sunt indexate de la zero
- Valoarea lui k nu va depăși 2000000000
- Se recomandă realizarea unei soluții recursive
Exemplu
Dacă n=6 și a= (2, 3, 5, 6, 4, 1), după apel k=264.
Explicație
Funcția F
primește trei argumente:
n
- un număr întreg pozitiv, reprezentând numărul de elemente din listaa
a
- o listă de numere întregi, având lungimean
k
- un număr întreg, inițial -1
Funcția începe prin a verifica cazul de bază n == 0
, caz în care returnează valoarea lui k
.
În caz contrar, verifică dacă ultimul element din lista a
este un număr par (a[n-1] % 2 == 0
). Dacă este par, verifică dacă k
este -1, caz în care atribuie lui k
valoarea elementului respectiv din lista a
. În caz contrar, concatenază valoarea elementului din lista a
cu k
, transformând k
într-un număr format din două sau mai multe cifre.
În final, funcția se autoapelează cu parametrii n-1
, a
și k
și returnează valoarea rezultată de această apelare.
Rezolvare
<syntaxhighlight lang="python"> def validate_n(n):
if isinstance(n, int) and 0 < n < 10: return True return False
def validate_a(a):
if isinstance(a, list) and all(isinstance(x, int) for x in a) and len(a) == 10: return True return False
def validate_k(k):
if isinstance(k, int): return True return False
def F(n, a, k):
if n == 0: return k elif a[n-1] % 2 == 0: if k == -1: k = a[n-1] else: k = int(str(a[n-1]) + str(k)) return F(n-1, a, k)
def main():
n = input("Introduceți un număr întreg pozitiv n (0 < n < 10): ") try: n = int(n) if validate_n(n): a = [] for i in range(10): elem = input(f"Introduceți elementul a[{i}]: ") elem = int(elem) a.append(elem) if validate_a(a): k = -1 result = F(n, a, k) if validate_k(result): print(f"Rezultatul este: {result}") else: print("Nu s-a putut calcula rezultatul.") else: print("Lista a nu este validă.") else: print("Numărul introdus nu este valid.") except ValueError: print("Nu ați introdus un număr întreg.")
</syntaxhighlight>