递归
调用自身的函数称为递归函数
递归的作用和循环是基本一致的
作用:
用简单程序解决复杂问题,把大问题层层转化为与原问题相似的规模较小的问题来求解;
只需少量程序就可描述解体过程所需的多次重复计算
创建一个函数,可以用来求任意数的阶乘
1!1
2!1x2=2
3!1x2x3=8
…
10!1x2x3x4x5x6x7x8x9x10
function jieCheng(num) {
let result = 1
for(let i = 2; i <= num; i++) {
result *= i;
}
return result
}
let result = jieCheng(3)
console.log(result);
如果用递归来解决问题
5!= 4!X 5
4!=3!X 4
3!=2!X 3
2!=1!X 2
1!=1
递归的核心思想就是将一个大问题拆分成一个一个小的问题,小的问题解决了,大的问题也就解决了
编写递归函数,一定要包含两个条件:
1.基线条件 —— 递归的终止条件
2.递归条件 —— 如何对问题进行拆分
function jieCheng2(num) {
// 基线条件
if(num===1) {
return 1
}
// 递归条件
return jieCheng2(num - 1) * num
}
result = jieCheng2(5)
console.log(result);
递归的作用和循环是一致的,不同点在于,递归思路比较清晰简洁,循环执行性能比较好
在开发中,一般的问题都可以通过循环解决,也是尽量去使用循环,少用递归
只在一些使用循环解决比较麻烦的场景下才使用递归
递归拼接树形结构
[
{ id: 1, parent: null, text: '菜单1' },
{ id: 11, parent: 1, text: '菜单1-1' },
{ id: 12, parent: 1, text: '菜单1-2' },
{ id: 2, parent: null, text: '菜单2' },
{ id: 21, parent: 2, text: '菜单2-1' },
]
把平级的结构变成树形的结构
[
{
id: 1, parent: null, text: '菜单1', children: [
{ id: 11, parent: 1, text: '菜单1-1' },
{ id: 12, parent: 1, text: '菜单1-2' },
]
},
{
id: 2, parent: null, text: '菜单2', children: [
{ id: 21, parent: 2, text: '菜单2-1' }
]
}
]
步骤:
1.筛选一级菜单
const rootList = [
{ id: 1, parent: null, text: '菜单1' },
{ id: 11, parent: 1, text: '菜单1-1' },
{ id: 12, parent: 1, text: '菜单1-2' },
{ id: 2, parent: null, text: '菜单2' },
{ id: 21, parent: 2, text: '菜单2-1' },
]
function getTreeList(rootList,id,list) {
for(item of rootList) {
if(item.parent == id) {//传进来每一项id的属性
list.push(item)
}
}
console.log('list',list);
}
const res = getTreeList(rootList,null,[])
console.log('res',res);
● null把菜单一和菜单二找出来了
● []最终会把所有数据都组装到空数组中并返回出来,初始值是空数组,然后往里面填充数据
● 某个元素的parent如果是null,就把他筛选出来,所以把菜单1和菜单2筛选出来,然后就是按照分类塞进去子菜单
2.加入子菜单
往每一项里加入一个children
const rootList = [
{ id: 1, parent: null, text: '菜单1' },
{ id: 11, parent: 1, text: '菜单1-1' },
{ id: 12, parent: 1, text: '菜单1-2' },
{ id: 2, parent: null, text: '菜单2' },
{ id: 21, parent: 2, text: '菜单2-1' },
]
function getTreeList(rootList, id, list) {
for (item of rootList) {
if (item.parent == id) {//传进来每一项id的属性
list.push(item)
}
}
for(let i of list) {
i.children = []
getTreeList(rootList,i.id,i.children)//运用递归的思想再次调用
}
return list
console.log(list );
}
const res = getTreeList(rootList, null, [])
console.log('res',res);