JS Klasyczna zadanie Fibonacciego - Różnice między dwoma rozwiązaniami

0

Pytanie

U mnie są dwa rozwiązania tego samego zadania, tej klasycznej zadania Fibonacciego, którą wszyscy wiedzą, jak go rozwiązać (nawet swoje zwierzęta).

Uprzejmie proszę NIE proponować żadnych innych rozwiązań. Ja po prostu chcę porównać te dwa rozwiązania. Za pomocą wyszukiwarki można znaleźć tysiące różnych rozwiązań.

Zadanie:

/*
     0  1  2  3  4  5  6  7   8   9 
    [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]

     fib(3) returns 2
     fib(9) returns 34
     and so on...

*/

Oba poniższe rozwiązania działają normalnie. Mój jedyny problem w tym,:

Czy rozwiązanie B wolniej, niż rozwiązanie A? Bo w B mamy ten wiersz poniżej:

fibArr.push(fibArr[fibArr.length - 1] + fibArr[fibArr.length - 2])

Czy to czyni length funkcja przechodzi przez cały masyw, aby obliczyć liczbę elementów? Czy już wraca od razu?

Rozwiązanie A:

function fib(n) {
  const fiboArray = [0,1]
  for(let i=2; i <= n; i++) {
    fiboArray.push(fiboArray[i-2] + fiboArray[i-1])
  }
  return fiboArray[n]
}
console.log(fib(5))

Rozwiązanie:

function fib(n) {
  const fibArr = [0, 1, 1]
  
  if(n == 0) {
    return 0
  }

  if(n == 1 || n == 2) {
    return 1
  }


  if (n > 2) {
    for (let i = 3; i <= n; i++) {
      fibArr.push(fibArr[fibArr.length - 1] + fibArr[fibArr.length - 2])
    }
  }
  
  return fibArr[fibArr.length - 1]
}


console.log(fib(9))
arrays javascript loops
2021-11-24 01:22:07
2

Najlepsza odpowiedź

1

Zgadzam się z niektórymi wynikami, rozwiązanie I lepiej.

W wielu sytuacjach jest używany .długość będzie taki szybki, bo przeglądarka wstępnie wyliczy ją i będzie działać tak samo skutecznie, jak gdyby sami stworzyliśmy zmienną lokalną, jednak myślę, że w twoim przypadku rozwiązanie A lepiej, bo używasz naciśnięcie na tablicy podczas cyklu, więc długość zostanie obliczona ponownie.

W odpowiedzi na ten post mówi o tym, ale nie ma push, jak u ciebie.

2021-11-24 01:38:51
1

@MisterJojo nie mógłbyś mi pokazać przykład kodu, aby ułatwić?

function my_Fibonacci(n)
  {
  let a = 0
    , b = 1
    , r = [0, 1]
    ;
  for(let i=2; i<=n; i++)
    {
    r.push(a+b) // new fibonacci value
    a = b       // set a for next addition
    b = r[i]    // set b for next addition
    }
  // return r.join(' - ')
  return b
  }

document.write(my_Fibonacci(9))

2021-11-24 01:47:47

W innych językach

Ta strona jest w innych językach

Русский
..................................................................................................................
Italiano
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................