You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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ă.
2
2
3
-
Fibonacci numbers are recursive by definition:
3
+
Numerele Fibonacci sunt recursive prin definiție:
4
4
5
5
```js run
6
6
functionfib(n) {
@@ -9,14 +9,14 @@ function fib(n) {
9
9
10
10
alert( fib(3) ); // 2
11
11
alert( fib(7) ); // 13
12
-
// fib(77); // will be extremely slow!
12
+
// fib(77); // va fi extrem de lent!
13
13
```
14
14
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.
16
16
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.
18
18
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)`:
20
20
21
21
```js no-beautify
22
22
...
@@ -25,68 +25,68 @@ fib(4) = fib(3) + fib(2)
25
25
...
26
26
```
27
27
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.
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`.
35
35
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.
37
37
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.
39
39
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.
41
41
42
-
Here are the steps of the new algorithm in details.
42
+
Iată pașii noului algoritm în detaliu.
43
43
44
-
The start:
44
+
Începutul:
45
45
46
46
```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
48
48
let a =1, b =1;
49
49
50
-
//get c = fib(3) as their sum
50
+
//obțineți c = fib(3) ca sumă a acestora
51
51
let c = a + b;
52
52
53
-
/*we now have fib(1), fib(2), fib(3)
53
+
/*acum avem fib(1), fib(2), fib(3)
54
54
a b c
55
55
1, 1, 2
56
56
*/
57
57
```
58
58
59
-
Now we want to get`fib(4) = fib(2) + fib(3)`.
59
+
Acum dorim să obținem`fib(4) = fib(2) + fib(3)`.
60
60
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:
62
62
63
63
```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)
66
66
c = a + b; // c = fib(4)
67
67
68
-
/*now we have the sequence:
68
+
/*acum avem secvența:
69
69
a b c
70
70
1, 1, 2, 3
71
71
*/
72
72
```
73
73
74
-
The next step gives another sequence number:
74
+
Următorul pas oferă un alt număr de secvență:
75
75
76
76
```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)
79
79
c = a + b; // c = fib(5)
80
80
81
-
/*now the sequence is (one more number):
81
+
/*acum secvența este (încă un număr):
82
82
a b c
83
83
1, 1, 2, 3, 5
84
84
*/
85
85
```
86
86
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.
88
88
89
-
The full code:
89
+
Codul complet:
90
90
91
91
```js run
92
92
functionfib(n) {
@@ -105,6 +105,6 @@ alert( fib(7) ); // 13
105
105
alert( fib(77) ); // 5527939700884757
106
106
```
107
107
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`.
109
109
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).
Copy file name to clipboardExpand all lines: 1-js/06-advanced-functions/01-recursion/03-fibonacci-numbers/task.md
+8-8Lines changed: 8 additions & 8 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -2,24 +2,24 @@ importance: 5
2
2
3
3
---
4
4
5
-
# Fibonacci numbers
5
+
# Numere Fibonacci
6
6
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.
8
8
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...`.
10
10
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.
12
12
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.
14
14
15
-
An example of work:
15
+
Un exemplu de lucrare:
16
16
17
17
```js
18
-
functionfib(n) { /*your code*/ }
18
+
functionfib(n) { /*codul tău*/ } }
19
19
20
20
alert(fib(3)); // 2
21
21
alert(fib(7)); // 13
22
22
alert(fib(77)); // 5527939700884757
23
23
```
24
24
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ă.
0 commit comments