// 1, 1, 2, 3, 5, 8, 13 ...
方法一
1)当n等于1或2时值为1
2)假设有一个数列arr = [1, 1, 2, 3, 5, 8, 13 ...],则n项为arr[n - 1], n - 1项为arr[n - 2], n - 2 项为 arr[n - 3];
3)且n项的值为前两项的和,则n项的值为arr[n - 3] + arr[n - 2];
const fibo = n => {
// 判断输入的值是否有效,也可以抛出异常
if (typeof n !== 'number' || !n) return 0;
let arr = [1, 1];
for (let i = 3; i <= n; i++) arr.push(arr[i - 3] + arr[i - 2]);
return arr[n - 1];
}
方法二
方法一实际会生成一个n项的数列,而实际只需要获取n项的值即可,故当n大于2时可以将数组中的值替换掉
const fibo = n => {
// 判断输入的值是否有效,也可以抛出异常
if (typeof n !== 'number' || !n) return 0;
let arr = [1, 1];
if (n > 2) { // 仅当n大于2时需要替换arr中的值
// 循环的时候将上一次末尾的值替换掉头部的值,而尾部的值则等于上一次数组中两项之和
for (let i = 3; i <= n; i++) arr = [arr[1], arr[0] + arr[1]];
return arr[1]; // n项的值
}
return 1; // n = 1 || 2
}