聊一聊前端算法面试(递归)
什么是递归
递归(Recursion)是指函数直接或间接地调用自身的方法。在计算机科学中,递归的使用十分广泛,例如快速排序、求阶乘、二分查找等算法都是递归的。
递归函数一般具有如下特点:
- 基线条件:函数的结束函数,使用 if 语句来判断是否结束递归。
- 递归条件:函数调用自己的条件。
- 自己调用自己:函数的最后一句代码应是调用自身。
递归的应用场景
递归可以用于解决很多问题,但是需要注意递归深度和效率问题。 在前端开发中,常用的递归场景有:
- DOM操作:对于树形结构的DOM的操作,常常使用递归,如深度遍历DOM,查找与选择DOM元素等。
- 数据处理:数组和对象中的嵌套结构,如果需要对其进行遍历或者查找,也可以使用递归。
如何编写递归函数
递归函数是函数调用自身,这也带来了很多注意点,需要确保递归的结束,不然会造成死循环,导致程序崩溃。
下面是一个计算阶乘的递归实现:
function factorial(n) {
//计算n的阶乘
if (n === 1) {
return 1;
} else {
return n * factorial(n - 1);
}
}
这里使用了基线条件n=1,在n=1的时候递归结束,返回结果1。如果n不等于1,则调用自身来计算n-1的阶乘,并将结果返回。
递归的性能问题
递归函数可能带来一定的性能问题,一些优化方法可供选择,比如减少递归的深度,尽可能地使用循环代替递归等。
递归的示例说明
递归遍历DOM树
下面是一个递归遍历DOM节点的示例:
function traverse(node) {
console.log(node);
if (node.hasChildNodes()) {
for (let child of node.childNodes) {
if (child.nodeType === Node.ELEMENT_NODE) {
traverse(child);
}
}
}
}
该函数的基线条件是节点没有子节点,递归条件是节点有子节点,并递归遍历每个子节点。调用该函数时,只需要传入DOM树的根节点即可完成遍历。
拍平嵌套数组
下面是一个递归拍平嵌套数组的示例:
function deepFlatten(arr) {
return arr.reduce(
(flat, current) =>
flat.concat(Array.isArray(current) ? deepFlatten(current) : current),
[]
);
}
该函数的递归条件是当前元素为数组,递归拍平数组并将结果合并到一个数组中,如果当前元素不是数组,则将其添加到结果数组中。
调用该函数时,只需要传入需要处理的嵌套数组即可。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:聊一聊前端算法面试(递归) - Python技术站