递归函数
- 在函数内部自身调用自身的函数
- 循环能做的所用事 递归都能做
- 循环做不了的事 递归都能做
方法
-
找临界值:无需计算,即可得出的值: ---- 退出递归的条件
-
这一次和上一次运算的 关系 fn和fn-1 的关系
-
假设当前递归函数可以运行,根据上一次调用自身的结果,写出这次运算的结果。 f(n) = f(n-1)+n => f(10)=f(9)+10
// 例如 function fn ( n ){ if(n == 1 ){ return 1 } return fn(n-1)+n } console.log(fn(3))
小测试
兔子繁殖问题:设有一对新生兔子,从第四个月开始他们每个月月初都生一对兔子,新生的兔子从第四个月月初开始又每个月生一对兔子,按此规律,并假定兔子没有死亡,n(n <= 20)个月月末共有多少对兔子?
function rabbits(n){
if(n<=3) {
return 1;
}
return rabbits(n-1)+rabbits(n-3)
}
console.log( rabbits(10) )
猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个,第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘多少个桃子?
// for循环模式
var sum = 1;
for (var i = 1; i < 10; i++) {
sum = (sum+1)*2;
}
console.log(sum)
// 递归方式
function getTotal(n){
if (n==10) {
return 1;
}
return (getTotal(n+1)+1)*2;
}
console.log(getTotal(1))
数组扁平化
- 数组扁平化的指将一个多维数组变成一维数组
递归方式
let arr = [1,[2,[3,[4,[5,6]]]]]
function flatten (arr){
var src = []
arr.map( item => {
if(Array.isArray(item)){
src = src.concat(flatten(item))
}else{
src.push(item)
}
})
return src
}
console.log(flatten(arr))