Skip to content

Commit e6c4e87

Browse files
Merge pull request #179
Recursion
2 parents 5ae1610 + 142ef55 commit e6c4e87

File tree

12 files changed

+250
-250
lines changed

12 files changed

+250
-250
lines changed

1-js/06-advanced-functions/01-recursion/01-sum-to/solution.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
The solution using a loop:
1+
Soluția folosind un loop:
22

33
```js run
44
function sumTo(n) {
@@ -12,7 +12,7 @@ function sumTo(n) {
1212
alert( sumTo(100) );
1313
```
1414

15-
The solution using recursion:
15+
Soluția folosind recursivitatea:
1616

1717
```js run
1818
function sumTo(n) {
@@ -23,7 +23,7 @@ function sumTo(n) {
2323
alert( sumTo(100) );
2424
```
2525

26-
The solution using the formula: `sumTo(n) = n*(n+1)/2`:
26+
Soluția folosind formula: `sumTo(n) = n*(n+1)/2`:
2727

2828
```js run
2929
function sumTo(n) {
@@ -33,8 +33,8 @@ function sumTo(n) {
3333
alert( sumTo(100) );
3434
```
3535

36-
P.S. Naturally, the formula is the fastest solution. It uses only 3 operations for any number `n`. The math helps!
36+
P.S. Firește, formula este cea mai rapidă soluție. Ea folosește doar 3 operații pentru orice număr `n`. Matematica ajută!
3737

38-
The loop variant is the second in terms of speed. In both the recursive and the loop variant we sum the same numbers. But the recursion involves nested calls and execution stack management. That also takes resources, so it's slower.
38+
Varianta cu bucle este a doua în ceea ce privește viteza. Atât în varianta recursivă cât și în varianta loop adunăm aceleași numere. Dar recursivitatea implică apeluri nested și gestionare de execution stack. Și asta necesită resurse, deci este mai lent.
3939

40-
P.P.S. Some engines support the "tail call" optimization: if a recursive call is the very last one in the function, with no other calculations performed, then the outer function will not need to resume the execution, so the engine doesn't need to remember its execution context. That removes the burden on memory. But if the JavaScript engine does not support tail call optimization (most of them don't), there will be an error: maximum stack size exceeded, because there's usually a limitation on the total stack size.
40+
P.P.S. Unele motoare suportă optimizarea "tail call": dacă un apel recursiv este chiar ultimul din funcție, fără alte calcule efectuate, atunci funcția exterioară nu va trebui să reia execuția, astfel încât motorul nu trebuie să își amintească contextul de execuție. Asta elimină povara asupra memoriei. Dar dacă motorul JavaScript nu acceptă optimizarea tail call (majoritatea nu o fac), va apărea o eroare: maximum stack size exceeded, deoarece există de obicei o limitare a dimensiunii totale din stack.

1-js/06-advanced-functions/01-recursion/01-sum-to/task.md

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@ importance: 5
22

33
---
44

5-
# Sum all numbers till the given one
5+
# Însumați toate numerele până la cel dat
66

7-
Write a function `sumTo(n)` that calculates the sum of numbers `1 + 2 + ... + n`.
7+
Scrieți o funcție `sumTo(n)` care calculează suma numerelor `1 + 2 + ... + n`.
88

9-
For instance:
9+
De exemplu:
1010

1111
```js no-beautify
1212
sumTo(1) = 1
@@ -17,20 +17,20 @@ sumTo(4) = 4 + 3 + 2 + 1 = 10
1717
sumTo(100) = 100 + 99 + ... + 2 + 1 = 5050
1818
```
1919

20-
Make 3 solution variants:
20+
Faceți 3 variante de soluție:
2121

22-
1. Using a for loop.
23-
2. Using a recursion, cause `sumTo(n) = n + sumTo(n-1)` for `n > 1`.
24-
3. Using the [arithmetic progression](https://en.wikipedia.org/wiki/Arithmetic_progression) formula.
22+
1. Folosind un for loop.
23+
2. Folosind o recursiune, cauza `sumTo(n) = n + sumTo(n-1)` pentru `n > 1`.
24+
3. Folosind formula de [progresie aritmetică](https://en.wikipedia.org/wiki/Arithmetic_progression).
2525

26-
An example of the result:
26+
Un exemplu de rezultat:
2727

2828
```js
29-
function sumTo(n) { /*... your code ... */ }
29+
function sumTo(n) { /*... codul tău ... */ }
3030

3131
alert( sumTo(100) ); // 5050
3232
```
3333

34-
P.S. Which solution variant is the fastest? The slowest? Why?
34+
P.S. Care variantă de soluție este cea mai rapidă? Cea mai lentă? De ce?
3535

36-
P.P.S. Can we use recursion to count `sumTo(100000)`?
36+
P.P.S. Putem folosi recursivitatea pentru a număra `sumTo(100000)`?

1-js/06-advanced-functions/01-recursion/02-factorial/solution.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
By definition, a factorial `n!` can be written as `n * (n-1)!`.
1+
Prin definiție, un factorial `n!` poate fi scris ca `n * (n-1)!`.
22

3-
In other words, the result of `factorial(n)` can be calculated as `n` multiplied by the result of `factorial(n-1)`. And the call for `n-1` can recursively descend lower, and lower, till `1`.
3+
Cu alte cuvinte, rezultatul `factorial(n)` poate fi calculat ca `n` înmulțit cu rezultatul lui `factorial(n-1)`. Iar apelul pentru `n-1` poate coborâ recursiv tot mai jos, tot mai jos, până la `1`.
44

55
```js run
66
function factorial(n) {
@@ -10,7 +10,7 @@ function factorial(n) {
1010
alert( factorial(5) ); // 120
1111
```
1212

13-
The basis of recursion is the value `1`. We can also make `0` the basis here, doesn't matter much, but gives one more recursive step:
13+
Baza recursivității este valoarea `1`. De asemenea putem face ca `0` să fie baza aici, nu contează prea mult, dar oferă încă un pas recursiv:
1414

1515
```js run
1616
function factorial(n) {

1-js/06-advanced-functions/01-recursion/02-factorial/task.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,17 @@ importance: 4
22

33
---
44

5-
# Calculate factorial
5+
# Calculează factorialul
66

7-
The [factorial](https://en.wikipedia.org/wiki/Factorial) of a natural number is a number multiplied by `"number minus one"`, then by `"number minus two"`, and so on till `1`. The factorial of `n` is denoted as `n!`
7+
[Factorialul](https://en.wikipedia.org/wiki/Factorial) unui număr natural este un număr înmulțit cu `"numărul minus unu"`, apoi cu `"numărul minus doi"`, și așa mai departe până la `1`. Factorialul lui `n` se notează cu `n!`.
88

9-
We can write a definition of factorial like this:
9+
Putem scrie o definiție a factorialului în felul următor:
1010

1111
```js
1212
n! = n * (n - 1) * (n - 2) * ...*1
1313
```
1414

15-
Values of factorials for different `n`:
15+
Valori ale factorialelor pentru diferite `n`:
1616

1717
```js
1818
1! = 1
@@ -22,10 +22,10 @@ Values of factorials for different `n`:
2222
5! = 5 * 4 * 3 * 2 * 1 = 120
2323
```
2424

25-
The task is to write a function `factorial(n)` that calculates `n!` using recursive calls.
25+
Sarcina este de a scrie o funcție `factorial(n)` care să calculeze `n!` folosind apeluri recursive.
2626

2727
```js
2828
alert( factorial(5) ); // 120
2929
```
3030

31-
P.S. Hint: `n!` can be written as `n * (n-1)!` For instance: `3! = 3*2! = 3*2*1! = 6`
31+
P.S. Indiciu: `n!` poate fi scris ca `n * (n-1)!` De exemplu: `3! = 3*2! = 3*2*1! = 6`
Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
The first solution we could try here is the recursive one.
1+
Prima soluție pe care am putea-o încerca aici este cea recursivă.
22

3-
Fibonacci numbers are recursive by definition:
3+
Numerele Fibonacci sunt recursive prin definiție:
44

55
```js run
66
function fib(n) {
@@ -9,14 +9,14 @@ function fib(n) {
99

1010
alert( fib(3) ); // 2
1111
alert( fib(7) ); // 13
12-
// fib(77); // will be extremely slow!
12+
// fib(77); // va fi extrem de lent!
1313
```
1414

15-
...But for big values of `n` it's very slow. For instance, `fib(77)` may hang up the engine for some time eating all CPU resources.
15+
...Dar pentru valori mari ale lui `n` este foarte lent. De exemplu, `fib(77)` poate bloca motorul pentru o perioadă de timp, consumând toate resursele CPU.
1616

17-
That's because the function makes too many subcalls. The same values are re-evaluated again and again.
17+
Asta pentru că funcția face prea multe subapelări. Aceleași valori sunt reevaluate din nou și din nou.
1818

19-
For instance, let's see a piece of calculations for `fib(5)`:
19+
De exemplu, să vedem o bucată de calcule pentru `fib(5)`:
2020

2121
```js no-beautify
2222
...
@@ -25,68 +25,68 @@ fib(4) = fib(3) + fib(2)
2525
...
2626
```
2727

28-
Here we can see that the value of `fib(3)` is needed for both `fib(5)` and `fib(4)`. So `fib(3)` will be called and evaluated two times completely independently.
28+
Aici putem vedea că valoarea lui `fib(3)` este necesară atât pentru `fib(5)` cât și pentru `fib(4)`. Deci `fib(3)` va fi apelat și evaluat de două ori în mod complet independent.
2929

30-
Here's the full recursion tree:
30+
Iată arborele de recursivitate complet:
3131

3232
![fibonacci recursion tree](fibonacci-recursion-tree.svg)
3333

34-
We can clearly notice that `fib(3)` is evaluated two times and `fib(2)` is evaluated three times. The total amount of computations grows much faster than `n`, making it enormous even for `n=77`.
34+
Putem observa în mod clar că `fib(3)` este evaluat de două ori, iar `fib(2)` este evaluat de trei ori. Suma totală a calculelor crește mult mai repede decât `n`, devenind enormă chiar și pentru `n=77`.
3535

36-
We can optimize that by remembering already-evaluated values: if a value of say `fib(3)` is calculated once, then we can just reuse it in future computations.
36+
Putem optimiza acest lucru prin memorarea valorilor deja evaluate: dacă o valoare de exemplu `fib(3)` este calculată o dată, atunci o putem reutiliza în calculele viitoare.
3737

38-
Another variant would be to give up recursion and use a totally different loop-based algorithm.
38+
O altă variantă ar fi să renunțăm la recursivitate și să folosim un algoritm complet diferit bazat pe loop.
3939

40-
Instead of going from `n` down to lower values, we can make a loop that starts from `1` and `2`, then gets `fib(3)` as their sum, then `fib(4)` as the sum of two previous values, then `fib(5)` and goes up and up, till it gets to the needed value. On each step we only need to remember two previous values.
40+
În loc să mergem de la `n` în jos la valori mai mici, putem face un loop care pornește de la `1` și `2`, apoi obține `fib(3)` ca sumă a acestora, apoi `fib(4)` ca sumă a două valori anterioare, apoi `fib(5)` și merge în sus și în sus, până când ajunge la valoarea necesară. La fiecare pas trebuie să ne amintim doar două valori anterioare.
4141

42-
Here are the steps of the new algorithm in details.
42+
Iată pașii noului algoritm în detaliu.
4343

44-
The start:
44+
Începutul:
4545

4646
```js
47-
// a = fib(1), b = fib(2), these values are by definition 1
47+
// a = fib(1), b = fib(2), aceste valori sunt prin definiție 1
4848
let a = 1, b = 1;
4949

50-
// get c = fib(3) as their sum
50+
// obțineți c = fib(3) ca sumă a acestora
5151
let c = a + b;
5252

53-
/* we now have fib(1), fib(2), fib(3)
53+
/* acum avem fib(1), fib(2), fib(3)
5454
a b c
5555
1, 1, 2
5656
*/
5757
```
5858

59-
Now we want to get `fib(4) = fib(2) + fib(3)`.
59+
Acum dorim să obținem `fib(4) = fib(2) + fib(3)`.
6060

61-
Let's shift the variables: `a,b` will get `fib(2),fib(3)`, and `c` will get their sum:
61+
Să schimbăm variabilele: `a,b` vor obține `fib(2),fib(3)`, iar `c` va obține suma lor:
6262

6363
```js no-beautify
64-
a = b; // now a = fib(2)
65-
b = c; // now b = fib(3)
64+
a = b; // acum a = fib(2)
65+
b = c; // acum b = fib(3)
6666
c = a + b; // c = fib(4)
6767

68-
/* now we have the sequence:
68+
/* acum avem secvența:
6969
a b c
7070
1, 1, 2, 3
7171
*/
7272
```
7373

74-
The next step gives another sequence number:
74+
Următorul pas oferă un alt număr de secvență:
7575

7676
```js no-beautify
77-
a = b; // now a = fib(3)
78-
b = c; // now b = fib(4)
77+
a = b; // acum a = fib(3)
78+
b = c; // acum b = fib(4)
7979
c = a + b; // c = fib(5)
8080

81-
/* now the sequence is (one more number):
81+
/* acum secvența este (încă un număr):
8282
a b c
8383
1, 1, 2, 3, 5
8484
*/
8585
```
8686

87-
...And so on until we get the needed value. That's much faster than recursion and involves no duplicate computations.
87+
...Și așa mai departe până când obținem valoarea necesară. Acest lucru este mult mai rapid decât recursivitatea și nu implică calcule duplicate.
8888

89-
The full code:
89+
Codul complet:
9090

9191
```js run
9292
function fib(n) {
@@ -105,6 +105,6 @@ alert( fib(7) ); // 13
105105
alert( fib(77) ); // 5527939700884757
106106
```
107107

108-
The loop starts with `i=3`, because the first and the second sequence values are hard-coded into variables `a=1`, `b=1`.
108+
Bucla începe cu `i=3`, deoarece prima și a doua valoare a secvenței sunt hard-coded în variabilele `a=1`, `b=1`.
109109

110-
The approach is called [dynamic programming bottom-up](https://en.wikipedia.org/wiki/Dynamic_programming).
110+
Abordarea se numește [programare dinamică de jos în sus](https://en.wikipedia.org/wiki/Dynamic_programming).

1-js/06-advanced-functions/01-recursion/03-fibonacci-numbers/task.md

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,24 +2,24 @@ importance: 5
22

33
---
44

5-
# Fibonacci numbers
5+
# Numere Fibonacci
66

7-
The sequence of [Fibonacci numbers](https://en.wikipedia.org/wiki/Fibonacci_number) has the formula <code>F<sub>n</sub> = F<sub>n-1</sub> + F<sub>n-2</sub></code>. In other words, the next number is a sum of the two preceding ones.
7+
Secvența [numerelor Fibonacci](https://en.wikipedia.org/wiki/Fibonacci_number) are formula <code>F<sub>n</sub> = F<sub>n-1</sub> + F<sub>n-2</sub></code>. Cu alte cuvinte, următorul număr este suma celor două numere precedente.
88

9-
First two numbers are `1`, then `2(1+1)`, then `3(1+2)`, `5(2+3)` and so on: `1, 1, 2, 3, 5, 8, 13, 21...`.
9+
Primele două numere sunt `1`, apoi `2(1+1)`, apoi `3(1+2)`, `5(2+3)` și așa mai departe: `1, 1, 2, 3, 5, 8, 13, 21...`.
1010

11-
Fibonacci numbers are related to the [Golden ratio](https://en.wikipedia.org/wiki/Golden_ratio) and many natural phenomena around us.
11+
Numerele Fibonacci sunt legate de [Golden ratio](https://en.wikipedia.org/wiki/Golden_ratio) și de multe fenomene naturale din jurul nostru.
1212

13-
Write a function `fib(n)` that returns the `n-th` Fibonacci number.
13+
Scrieți o funcție `fib(n)` care să returneze al `n-lea` număr Fibonacci.
1414

15-
An example of work:
15+
Un exemplu de lucrare:
1616

1717
```js
18-
function fib(n) { /* your code */ }
18+
function fib(n) { /* codul tău */ } }
1919

2020
alert(fib(3)); // 2
2121
alert(fib(7)); // 13
2222
alert(fib(77)); // 5527939700884757
2323
```
2424

25-
P.S. The function should be fast. The call to `fib(77)` should take no more than a fraction of a second.
25+
P.S. Funcția ar trebui să fie rapidă. Apelul la `fib(77)` nu ar trebui să dureze mai mult de o fracțiune de secundă.

1-js/06-advanced-functions/01-recursion/04-output-single-linked-list/solution.md

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
# Loop-based solution
1+
# Soluție bazată pe loop
22

3-
The loop-based variant of the solution:
3+
Varianta soluției bazată pe loop:
44

55
```js run
66
let list = {
@@ -30,7 +30,7 @@ function printList(list) {
3030
printList(list);
3131
```
3232

33-
Please note that we use a temporary variable `tmp` to walk over the list. Technically, we could use a function parameter `list` instead:
33+
Vă rugăm să rețineți că folosim o variabilă temporară `tmp` pentru a parcurge lista. Din punct de vedere tehnic, am putea folosi în schimb un parametru de funcție `list`:
3434

3535
```js
3636
function printList(list) {
@@ -43,15 +43,15 @@ function printList(list) {
4343
}
4444
```
4545

46-
...But that would be unwise. In the future we may need to extend a function, do something else with the list. If we change `list`, then we lose such ability.
46+
...Dar asta ar fi neînțelept. În viitor s-ar putea să avem nevoie să extindem o funcție, să facem altceva cu lista. Dacă schimbăm `list`, atunci pierdem o astfel de abilitate.
4747

48-
Talking about good variable names, `list` here is the list itself. The first element of it. And it should remain like that. That's clear and reliable.
48+
Vorbind despre nume de variabile bune, `list` aici este lista însăși. Primul element al acesteia. Și ar trebui să rămână așa. Este clar și de încredere.
4949

50-
From the other side, the role of `tmp` is exclusively a list traversal, like `i` in the `for` loop.
50+
De cealaltă parte, rolul lui `tmp` este exclusiv o traversare a listei, ca și `i` în bucla `for`.
5151

52-
# Recursive solution
52+
# Soluție recursivă
5353

54-
The recursive variant of `printList(list)` follows a simple logic: to output a list we should output the current element `list`, then do the same for `list.next`:
54+
Varianta recursivă a `printList(list)` urmează o logică simplă: pentru a scoate o listă trebuie să scoatem elementul curent `list`, apoi să facem același lucru pentru `list.next`:
5555

5656
```js run
5757
let list = {
@@ -70,19 +70,19 @@ let list = {
7070

7171
function printList(list) {
7272

73-
alert(list.value); // output the current item
73+
alert(list.value); // afișează elementul curent
7474

7575
if (list.next) {
76-
printList(list.next); // do the same for the rest of the list
76+
printList(list.next); // procedează la fel pentru restul listei
7777
}
7878

7979
}
8080

8181
printList(list);
8282
```
8383

84-
Now what's better?
84+
Acum ce este mai bine?
8585

86-
Technically, the loop is more effective. These two variants do the same, but the loop does not spend resources for nested function calls.
86+
Din punct de vedere tehnic, un loop este mai eficient. Aceste două variante fac același lucru, dar loop-ul nu consumă resurse pentru apeluri de funcții nested.
8787

88-
From the other side, the recursive variant is shorter and sometimes easier to understand.
88+
De partea cealaltă, varianta recursivă este mai scurtă și uneori mai ușor de înțeles.

1-js/06-advanced-functions/01-recursion/04-output-single-linked-list/task.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ importance: 5
22

33
---
44

5-
# Output a single-linked list
5+
# Scoate un singur linked list
66

7-
Let's say we have a single-linked list (as described in the chapter <info:recursion>):
7+
Să presupunem că avem un singur linked list (așa cum este descris în capitolul <info:recursion>):
88

99
```js
1010
let list = {
@@ -22,8 +22,8 @@ let list = {
2222
};
2323
```
2424

25-
Write a function `printList(list)` that outputs list items one-by-one.
25+
Scrieți o funcție `printList(list)` care scoate elementele din listă unul câte unul.
2626

27-
Make two variants of the solution: using a loop and using recursion.
27+
Realizați două variante ale soluției: folosind un loop și folosind recursivitatea.
2828

29-
What's better: with recursion or without it?
29+
Ce este mai bine: cu recursivitate sau fără ea?

0 commit comments

Comments
 (0)