这是我参与更文挑战的第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函数里面呢 函数里面有 return
了 a()
函数的返回值 跑过去调用 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
总结
其实, 在上面两个函数中我的中提思路就是 **总体 拆封 归纳 **