理解递归
‘要理解递归,首先要理解递归。’
——看到这句话,应该明白,递归本就是一种解决问题的方法,它从解决问题各个小部分开始,知道解决最初的大问题。常用与自身函数的调用。
例如
function fn(num){
fn(num)
}
这样的直接调用自身的方法或函数,又例如
function fn1(num){
fn2(num)
}
function fn2(num){
fn1(num)
}
一些著名的递归算法
计算一个数的阶乘
迭代阶乘
初步给他定义为:(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等数组组成的序列
迭代求斐波那契数
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)
}