递归,在计算机科学中是指一种通过重复将问题分解为同类的子问题而解决问题的方法。简单来说,递归表现为函数调用函数本身。
简单理解就是: 定义一个函数,传入参数符合函数内封装的代码就return出去,不符合就在函数内调用函数本身,直到最终数符合条件

具体代码
//递归 递归就是看他数组或对象里不管有多少层都把它抛出来 然后在归到一起计算
// function f(n) {
// if (n == 1) return 1; //条件,没有条件的话递归就会出现2死循环
// return n + f(n - 1)
// }
// let fn = f(5)
// console.log(fn)
函数(n=5)的阶乘
//阶乘 跟相加很像 公式都一样只不过是把加号变成了乘号
// function f(n) {
// if (n == 1) return 1;
// return n * f(n - 1) //公式
// }
// let fn = f(5)
// console.log(fn)
let arr = [100, 200, 300, [400, 500, [49, 59, 82, [232, 535, 77]]]]
像这种数组的就是数组套数组 你要求和的话首先要循环有几层数组就要循环几次,那要是不知道有多少层数组的话怎么办 这个时候就用到递归了,递归是不管这个数组里面有多少层数组它是一层一层的往下抛把数组里的数字都抛出来在做计算
/ let arr = [100, 200, 300, [400, 500, [49, 59, 82, [232, 535, 77]]]]
// let newArr = 0;
// function f(arr) {
// arr.forEach((item)=>{ //item是数组里的数字
// if(typeof item == "number") { //把数字的都加到新数组里
// newArr += item;
// }else{
// return f(item) //不是数字的就return出去
// }
// })
// }
// f(arr)
// console.log(newArr)
#像对象这种包着数组该怎么用递归
//要算出没有孩子的钱
let arr1 = [
{
name: "张三",
money: 100,
children: [
{ name: "张欢欢", money: 200 },
{
name: "张乐乐",
money: 100,
children: [
{ name: "张小欢", money: 300 },
{ name: "张小乐", money: 400 },
],
},
],
},
{
name: "李四",
money: 100,
children: [
{ name: "李红红", money: 500 },
{ name: "李明明", money: 600 },
],
},
];
let newArr = 0; //数组用来存放有孩子的钱
function f(arr) {
arr.forEach((item=>{
if(item.children) {
f(item.children)
}else {
return newArr += item.money
}
}))
}
f(arr1)
console.log(newArr)
递归的缺点
在程序执行中,递归是利用堆栈来实现的。每当进入一个函数调用,栈就会增加一层栈帧,每次函数返回,栈就会减少一层栈帧。而栈不是无限大的,当递归层数过多时,就会造成 栈溢出 的后果。
显然有时候递归处理是高效的,比如归并排序;有时候是低效的,比如数孙悟空身上的毛,因为堆栈会消耗额外空间,而简单的递推不会消耗空间。
递归的程序特性
优雅性
相比其他解法,使用递归法,你会发现只需少量程序就可描述出解题过程,大大减少了程序的代码量,而且很好理解。递归的能力在于用有限的语句来定义对象的无限集合。
反向性
由于递归调用程序需要维护调用栈,而栈具有后进先出的特征,因此递归程序适合满足取反类需求。我们在第五部分有一些编程实践,比如字符串取反,链表取反等相关有趣的算法问题。
递推关系
递归程序可以较明显的发现递推关系,反过来也可以这么说,具有递推关系的问题基本都可以通过递归求解。递推关系常见问题有 阶乘计算文章来源:https://uudwc.com/A/EypNn
文章来源地址https://uudwc.com/A/EypNn