递归-Javascript

134 阅读1分钟

理解递归

‘要理解递归,首先要理解递归。’
——看到这句话,应该明白,递归本就是一种解决问题的方法,它从解决问题各个小部分开始,知道解决最初的大问题。常用与自身函数的调用。
例如

function fn(num){
  fn(num)
}

这样的直接调用自身的方法或函数,又例如

function fn1(num){
  fn2(num)
}
function fn2(num){
  fn1(num)
}

这种间接调用自身函数的也叫递归。

一些著名的递归算法

计算一个数的阶乘

5! => 5 X 4 X 3 X 2 X 1 = 120

迭代阶乘

初步给他定义为:(n)X(n-1)X(n-2)X...X1
用一个循环来写,如下

function fn(number){
  if(number<0) retrun undefined
  let total = 1
  for(let n = number;n>1;n--){
    total = total * n
  }
  return total
}
console.log(fn(5))  // 120

递归阶乘

怎么来理解呢?
5! = 5 x 4 x 3 x 2 x 1 。 不就等于 5X4! = 5 x 4x3x2x1 吗?
一次类推:5x4x3! .....
5x4x3x2!...
5x4x3x2x1!
所以我们可以使用递归来计算:

function factorial(n){
  if(n === 1 || n === 0){
    return 1
  } // 1的阶乘、0的阶乘 = 1
  return n * factorial(n-1)
}
console.log(factorial(5)) //120

斐波那契数列

它是一个由0、1、1、2、3、5、8、13、21、34等数组组成的序列

  • 位置0的斐波那契数是0
  • 1和2的斐波那契数是1
  • n(此处n>2)的斐波那契数是(n-1)的斐波那契数加上(n-2)的斐波那契数

迭代求斐波那契数

function fn(n){
  if(n<1) return 0
  if(n<=2) return 1
  let left = 0
  let right = 1
  let fibn = n
  for(let i = 2;i <= n;i++){
    fibn =  left + right // f(n-1) + f(n+1)
    left = right
    right = fibn
  }
  return fibn
}

递归求斐波那契数

function fn(n){
  if(n<1) return 0
  if(n<=2) return 1
  return fn(n-1) + fn(n-2)
}