斐波那契数列(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();
}