用閉包替換遞迴實現斐波拉契數列

jilaokang發表於2018-10-08

斐波那契數列指的是這樣一個數列 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));
複製程式碼

該方法封裝了一個閉包,對值的儲存與操作類似第一種。

相關文章