理解递归
‘要理解递归,首先要理解递归。’
——看到这句话,应该明白,递归本就是一种解决问题的方法,它从解决问题各个小部分开始,知道解决最初的大问题。常用与自身函数的调用。
例如
function fn(num){
fn(num)
}
这样的直接调用自身的方法或函数,又例如
function fn1(num){
fn2(num)
}
function fn2(num){
fn1(num)
}
这种间接调用自身函数的也叫递归。
一些著名的递归算法
计算一个数的阶乘
5! => 54321 = 120
迭代阶乘
初步给他定义为(n)(n-1)(n-2)*…*1
用一个循环来写,如下
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! = 54321。 不就等于 54! = 5 * 4321 吗?
一次类推:543! …
5432!..
5432*1!
所以我们可以使用递归来计算:
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)
}