Skip to content
js
const speed = function (fn, num) {
  console.time('time')
  const value = fn(num)
  console.timeEnd('time')
  console.log(`return:${value}`)
}

/**
 * @description 斐波那契数列
 * @description Fibonacci sequence
 * @param {number} n -第几个位置
 * @param {number} n - The position in the sequence
 * @return {number} 参数对应在数列中的数字
 * @return {number} The number at the position in the sequence
 */
let fibonacci = function (n) {
  if (n < 1)
    throw new Error('Incorrect parameter')
  if (n === 1 || n === 2)
    return 1
  return fibonacci(n - 1) + fibonacci(n - 2)
}

speed(fibonacci, 35)

// 函数记忆
// Function memoization
const memory = function (fn) {
  const obj = {}
  return function (n) {
    if (obj[n] === undefined)
      obj[n] = fn(n)
    return obj[n]
  }
}
fibonacci = memory(fibonacci)

speed(fibonacci, 35)

/**
 * @description 斐波那契动态规划版本(最优解)
 * @description Fibonacci dynamic programming version (optimal solution)
 */
function fibonacci_DP(n) {
  let res = 1
  if (n === 1 || n === 2)
    return res
  n = n - 2
  let cur = 1
  let pre = 1
  while (n) {
    res = cur + pre
    pre = cur
    cur = res
    n--
  }
  return res
}

speed(fibonacci_DP, 35)