求阶乘:
/* 求阶乘 */
function fun(n) {
if (n == 1) return 1
return fun(n - 1) * n
i--;
}
console.log(fun(3));
斐波那契数列:
/* 斐波那契数列 */
function fbnq(num) {
if (num == 1 || num == 2) return 1
return fbnq(num - 1) + fbnq(num - 2)
num--;
}
console.log(fbnq(6));
递归遍历数据:
/* 递归遍历数据 */
var data = [
{
"id": 1,
"name": "家电",
"goods": [
{
"id": 11,
"gname": "冰箱",
"goods": [
{
"id": 111,
"gname": "海尔"
}, {
"id": 112,
"gname": "美的"
}
]
},
{
"id": 12,
"gname": "洗衣机"
}
]
},
{
"id": 2,
"name": "服饰"
}
];
function getId(json, id) {
var o = {};
json.forEach(function (item) {
if (item.id == id) {
o = item
}
else if (item.goods && item.goods.length) {
o = getId(item.goods, id)
}
})
return o
}
console.log(getId(data, 1));
console.log(getId(data, 2));
console.log(getId(data, 111));
console.log(getId(data, 211));
树形结构和平铺结构的转换:
1. 正向-树形结构转平铺
// 正向-树形结构转平铺
// 从外到内依次递归,有 children 则继续递归
function treeToArr(data, pid=null, res=[]) {
data.forEach(item => {
res.push({ pid: pid, id: item.id, name: item.name });
if(item.children && item.children.length !== 0) {
treeToArr(item.children, item.id, res);
}
});
return res;
};
const arr = treeToArr(data);
console.log(arr);
2. 逆向-平铺结构转树形
// 依次在数组中找到每一层级对应的元素,同时每个元素的 children 属性对应的 value 通过 pid 去找到,然后递归执行下去
function arrToTree(arr, pid=null) {
const res = [];
arr.forEach(item => {
if(item.pid === pid) {
// 这样每次都需要遍历整个数组,因此时间复杂度为 n*n
// const children = arrToTree(arr, item.id)
// 往下递归时,每次数组的大小都在减小,每次都筛选掉父代元素,最终的时间复杂度为 n*logn
const children = arrToTree(arr.filter(v => v.pid !== pid), item.id);
if(children.length) {
res.push({ ...item, children })
}else {
res.push({ ...item })
}
}
});
return res;
};
const tree = arrToTree(arr);
console.log(JSON.stringify(tree, null, 2));