【阅读笔记:递归】要理解递归,首先要理解递归

什么是递归?

  • 递归是一种解决问题的方法,它从解决问题的各个小部分开始,直到解决最初的大问题。递归一般涉及到函数调用自身。
  • 一般像下面这样能直接调用自身的方法或函数:
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),下面是调用状况的结果

为何要使用递归?它更快吗

  • 相比于递归。迭代比递归要更快,可是,递归相对于迭代来讲更容易理解,须要的代码一般也更少。
相关文章
相关标签/搜索