js算法中常用的递归算法

1,257 阅读1分钟

递归算法的特点是自身调用自身,代码量一般都很少,但是效率不高。

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
}