递归算法的特点是自身调用自身,代码量一般都很少,但是效率不高。
1、阶乘的实现:n!=n*(n-1)*(n-2).....*2*1;
(1)、使用递归
function jc(n){
if(n<=1) return 1
return n*jc(n-1);
}
console.log(jc(4)) //24
(2)、使用for循环
function jcFor(n){
if(n<=1) return 1
let n1=1,n2;
for(let i=1;i<n;i++){
n2=n1*(i+1);
n1=n2
}
return n2
}
2、斐波那契数列的实现
1,1,2,3,5,8....
(1)、递归
function fbnq(n){
if(n<1) return n=0;
if(n<=2) return n=1;
return fbnq(n-2)+fbnq(n-1)
}
console.log(fbnq(3)) //2
(2)、非递归
function fbnqFor(n){
if(n===0) return 0;
if(n<=2) return 1;
let n1=1,n2=1,n3=0;
for(let i=2;i<n;i++){
n3=n2+n1;
n1=n2;
n2=n3;
}
return n3
}
console.log(fbnqFor(5)) //5
3、数组转化为树结构
const arr1 = [
{ id: 1, parent_id: '' },
{ id: 2, parent_id: 1 },
{ id: 3, parent_id: 1 },
{ id: 4, parent_id: 2 },
{ id: 5, parent_id: 4 }
];
转化为树结构:使用递归处理
const newTree=(items,id='')=>items.filter(
item=>item['parent_id']===id
).map(
item=>({...item,children:newTree(items,item.id)})
)
解析一下代码:newTree方法接受两个参数,一个是要处理的数据,一个是数据的id,
通过数组的filter方法,过滤出来item 的id和parent_id相同的数据。使用map方法
生成一个新数组,同事递归处理。
使用对象的方式处理:
function doArr(arr){
let newArr=arr,obj={},res=[];
newArr.map(item=>{
obj[item.id]=item
})
newArr.map(item=>{
if(item.parent_id==='') res.push(item);
for(let k in obj){
if(item.id===obj[k].parent_id){
if(item.children){
item.children.push(obj[k])
}else{
item.children=[obj[k]]
}
}
}
})
retrun res
}