Leetcode-Fibonacci 시퀀스 (js)

피보나치 수열 이해

n 번째 숫자는 시퀀스의 처음 두 개를 더하여 얻습니다 : f (n) = f (n-1) + f (n -2), 코드를 사용하여 피보나치 시퀀스를 구현하는 것은 재귀 적 쓰기를 조사하는 것입니다. 그는 수많은 쓸모없는 계산을 수행했기 때문에 시간 복잡성과 공간 복잡성에 대한 엄격한 요구 사항에서 재귀만을 사용하는 것은 불가능합니다.

1, 1, 2, 3, 5, 8, 13,…

일반 구현 (재귀)

이런 식으로 계산하면 반복되는 계산이 많아지고 재귀 레이어의 수가 점점 더 깊어지고 스택을 재귀 적으로 버스트하기 쉽습니다.

const fib = n => n <= 1 ? n :fib(n-1)+fib(n-2)
console.log(fib(5))

시간 복잡성 감소 (클로저 + 재귀)

캐시 레이어를 추가하여 이전에 계산 된 값을 저장하는 데 사용됩니다. 새로운 값을 계산해야 할 경우 캐시를 먼저 검색하고 캐시 히트를 직접 반환하고 계산을 수행합니다. 놓친 경우 계속하십시오. 그러나 배열을 사용하면 공간이 복잡해집니다.

const fib3 = function (n) {
    
    
  n <= 1 && n
  const cache = []
  cache[0] = 1
  cache[1] = 1
  function memoize(num) {
    
    
      if (cache[num] !== undefined) {
    
    
          return cache[num]
      }
      cache[num] = memoize(num - 1) + memoize(num - 2)
      // console.log(cache[num])
      return cache[num]
  }
  const result = memoize(n-1)
  return result
}
console.log(fib3(4))

하지만이 구현에는 문제가 있습니다. 순서대로 피보나치 수열을 계산하지 않으면 추가 소비량이 증가합니다. 예를 들어 직접 fib (1000)을 계산합니다. undefined로 초기화 됨이 크기는 작지만 계산이 완료된 후 1-1000 사이의 피보나치 수열이 채워집니다.
참조 네트워크의 한 가지 해결책은 배열을 캐싱을 위해 객체로 교체하여 정의되지 않은 채울 시간을 줄이는 것입니다.

// 闭包 + 缓存对象
const fibonacci = (function () {
    
    
  const f = {
    
    }
  return function(n) {
    
    
    if(n === 0 || n === 1) {
    
    
      return n
    }
    if(f[n-2] === undefined) {
    
    
      f[n-2] = fibonacci(n-2)
    }
    if(f[n-1] === undefined) {
    
    
      f[n-1] = fibonacci(n-1)
    }
    return f[n] = f[n-1] + f[n-2]
  }
})()

쓰기 방식을 앞에서 뒤로 변경하려면 ::: 이전 카운트부터 단계적으로 계산하고 n까지 계산합니다.

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

공간 복잡성 감소

사용하지 마십시오 및 배열, 공간 차원을 앞에서 뒤로 줄이십시오

const fib = n =>{
    
    
    n <= 1 && n
    let prev2 = 0
    let prev1 = 1
    let result = 0
    for (let i = 2;i<=n;i++) {
    
    
      result =prev2+prev1
      prev2 = prev1
      prev1 = result
    }
    return result
}

추천

출처blog.csdn.net/pz1021/article/details/105752392