用js实现斐波那契数列

309 阅读1分钟

斐波那契数列(Fibonacci sequence),指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(0)=0,F(1)=1,F(n)=F(n - 1)+F(n - 2)(n≥ 2,n∈ N*)。

方法一(动态规划):

/**
 * @description 斐波那契数列之动态规划
 * @param {number} prod 一个大于等于0的整数
 * @returns 返回斐波那契数
 */
function fibo(prod) {
  if (prod < 2) {
    return prod;
  }

  const numArr = [0, 1];
  for (let i = 2; i <= prod; i++) {
    numArr.push(numArr[0] + numArr[1]);
    numArr.splice(0, 1);
  }

  return numArr[1];
}

/**
 * @description 获取斐波那契数(递归版)
 * @param {number} n 一个大于等于0的整数
 */
const fiboPro = (n) => {
  if (n < 2) {
    return n;
  }

  let prev = 0;
  let curr = 1;
  let temp = 0;

  for (let i = 2; i <= n; i++) {
    temp = prev;
    prev = curr;
    curr += temp;
  }

  return curr;
}

方法二(递归):

/**
 * @description 斐波那契数列之递归
 * @param {number} num 一个大于等于0的整数
 * @returns 返回斐波那契数
 */
function fib(num) {
  if (num < 2) {
    return num;
  }

  return fib(num - 1) + fib(num - 2);
}

方法三(通项公式):

/**
 * @description 斐波那契数列之通项公式
 * @param {number} num 一个大于等于0的整数
 * @returns 返回斐波那契数
 */
function fibo(num) {
  if (num < 2) {
    return num;
  }

  if (num === 2) {
    return 1;
  }

  return ((1 / Math.sqrt(5)) * (((1 + Math.sqrt(5)) / 2) ** num - ((1 - Math.sqrt(5)) / 2) ** num)).toFixed();
}

原文链接:www.wansongtao.com/blog/detail…