用闭包替换递归实现斐波拉契数列

278 阅读1分钟

斐波那契数列指的是这样一个数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597...

斐波拉契数列的典型特征是下一项是由前两项组成的和,我们有很多方式可以实现。

  1. 定义一个数组记录每一个值,做值运算
  2. 定义两个基础值,用递归做运算
  3. 采用闭包记录下基础值

他们的实现重点都是记录值,我们也可以说,能够做值记录的方法都可以实现斐波拉契数列。

数组方法

var newItem = arr => {
  return arr[arr.length - 1] + arr[arr.length - 2];
};

var allItem = itemNum => {
  let arr = [1, 1];

  for (let i = 0; i < itemNum - 2; i++) {
    arr.push(newItem(arr));
  }

  return arr;
};

console.log(allItem(10));

该方法最为直观,对数组尾项进行操作。

递归运算

let result = [1, 1];

var arrHandle = itemNum => {
  result.push(result[result.length - 1] + result[result.length - 2]);

  if (result.length !== number) {
    goback(itemNum);
  }
};

arrHandle(10);
console.log(result);

该方法的result必须放在函数外部,并且函数不纯,改变了result,对后面的操作有影响。

闭包运算

let arrHandle = () => {
  let result = [1, 1];

  return itemNum => {
    for (let i = 0; i < itemNum - 2; i++) {
      let newItem = result[result.length - 1] + result[result.length - 2];
      result.push(newItem);
    }

    return result;
  };
};

let getAllItem = arrHandle();
console.log(getAllItem(10));

该方法封装了一个闭包,对值的保存与操作类似第一种。