【閱讀筆記:遞歸】要理解遞歸,首先要理解遞歸

什麼是遞歸?

  • 遞歸是一種解決問題的方法,它從解決問題的各個小部分開始,直到解決最初的大問題。遞歸一般涉及到函數調用自身。
  • 一般像下面這樣能直接調用自身的方法或函數:
function recursiveFunction(someParam) {
  recursiveFunction(someParam);
}
複製代碼
  • 或者間接調用自身的函數,也是遞歸函數。
function recursiveFunction1(someParam) {
  recursiveFunction2(someParam);
}

function recursiveFunction2(someParam) {
  recursiveFunction1(someParam);
}
複製代碼
  • 沒個遞歸函數都必須有基線條件,即一個再也不遞歸調用的條件(中止點),以防止無限遞歸。

計算一個數的階乘

  • 5的階乘爲5x4x3x2x1,結果是120。

用迭代來計算階乘

function factorialIterative(number) {
  if (number < 0) {
    return undefined;
  }
  let total = 1;
  for (let n = number; n > 1; n--) {
    total  = total * n;
  }
  return total;
}
console.log(factorialIterative(5)); // 120
複製代碼
  • 從給定的number開始計算階乘,並減小n,直到它的值爲2。

用遞歸來計算階乘

function factorial(n) {
  if (n === 1 || n === 0) {
    return 1;
  }
  return n * factorial(n - 1);
}
console.log(factorial(3)); // 6
複製代碼
  • 遞歸在瀏覽器中調用站棧的行爲是先執行、後調用,下圖展現了各個步驟和調用棧中的行爲:
  • 若是忘記加上用以中止函數遞歸調用的基線條件,瀏覽器就會拋出棧溢出錯誤

斐波那契數列

  • 斐波那契數列是另外一個能夠用遞歸解決的問題。它是由0、一、一、二、三、五、八、1三、2一、34等數組組成的序列。2由1+1獲得,3由1+2獲得,5由2+3獲得,以此類推
function fibonacci(n){
  if (n < 1) return 0; // 位置0的斐波那契數是零
  if (n <= 2) return 1; // 1和2的斐波那契數是1
  return fibonacci(n - 1) + fibonacci(n - 2);
}
複製代碼
  • 若是咱們試着尋找fibonacci(5),下面是調用狀況的結果

爲何要使用遞歸?它更快嗎

  • 相比於遞歸。迭代比遞歸要更快,可是,遞歸相對於迭代來講更容易理解,須要的代碼一般也更少。
相關文章
相關標籤/搜索