递归? 你真的了解递归吗?

193 阅读2分钟

这是我参与更文挑战的第2天,活动详情查看: 更文挑战

啥是递归啊?

递归是一种:函数的自调用方式。 其实,就是小组的领导接到一个任务, 他把这个任务呢划分成了多个小任务,分配下去完成。在完成之后呢,在重新汇总。

案例一

使用函数求出5的阶乘

function getFac(n){
    return  n * getFac(n - 1)
}

console.log(getFac(5));

这边如果你要是打开了浏览器控制台, 会发现,他报了一个超出最大执行栈 ,为什么会有这样的错误呢, 因为 我们程序在调用的时候 n = 5 而这个 n呢, 会每次之前小 1。
正常情况下数学中 计算阶乘时 当我们计算到 =1的时候 就不会计算了, 而我们这个程序呢n 会 =0, = -1, =-2,他没有一个固定的结束范围, 这时候 我们在来改一下

function getFac(n){
    if(n == 1 ) {
        return 1
    }else{    
    return  n * getFac(n - 1)
    }
}

console.log(getFac(5));  //105

这里呢 我给他了一个范围, 一个条件, 什么是条件呢

函数的调用栈

我们先说明一下函数的调用栈, 请看下面的代码

function a (num1, num2){
    return a + b
}
function c(num3){
    return a(67, 78) + num3
}


console.log(c(67));  //212

在这里面呢, 我们先调用的c函数 在c函数里面呢 函数里面有 returna() 函数的返回值 跑过去调用 a()函数 将 67 + 78 的计算结果 传递给 c, 在c里面 将a的结果和函数被调用时的形参67想加 等于212 然后函数执行完了 清空执行栈,等待下次调用

案例二

在看看 下面这行代码 let arrs= [78, 89, 67, 2, 5, 15,90,100] 怎么求出这组数据的最大值呢?

function getMax(arr){
    if(arr.length ===0 ) return undefined
    else if{arr.length == 1} return arr[0]
    let c = Math.floor(arr.length / 2);
    
    let arr1 = arr.slice(0, c),
    //查找数组里面的最大值
    let arr1Max = getMax(arr1)
    
    let arr2 = arr.slice(c)
    let arr2Max = getMax(arr2)
    
    if(arr1Max > arr2Max){
        return arr1Max
    }else{
        return arr2Max
    }
}

console.log(getMax(arrs)); //100


总结

其实, 在上面两个函数中我的中提思路就是 **总体 拆封 归纳 **