目录
背景:
在最近一次的刷题中,遇到了有关递归方面的问题,对其进行了深入的研究
题目:
function findRegion(regions, regionName) {
// TODO: 在这里写入具体的实现逻辑
// 需要从树状结构的行政信息中,遍历找到目标区域的行政信息,如输入:成都市,返回 [四川省,成都市]
// 如果所输入的位置信息不存在,则返回 null
}
module.exports = findRegion; // 检测需要,请勿删除
本题主要考察根据用户输入的地址信息进行自动补全的功能。
- 如果能找到具体的地址信息,则以数组形式返回它的完整行政信息,比如:
- 输入
"青羊区"
, 则返回[ "四川省", "成都市", "青羊区" ]
。- 输入
"成都市"
, 则返回[ "四川省", "成都市" ]
。- 输入
"四川省"
, 则返回[ "四川省" ]
。- 如果不存在该地址,则返回一个
null
。
其中regions是地区数据,regionName是所输入的地址信息
考察点:
本题主要考察了递归的使用
递归就是函数自己调用自己。是循环运算的一种算法模式。常用于解决一些数学运算,如阶乘函数,幂函数,和斐波那契数列
使用时需要注意以下两个部分:
1. 递归调用的过程
2. 递归终止的条件(出口)
在没有限制的条件下,递归运算会无终止地自身调用,所以在递归运算中要结合条件语句(if)进行控制,只有在某个条件成立
时候才允许执行递归,否则不允许调用自身
递归就是:
走到出口的时候,再向上一步一步的赋值计算后,返回结果。
总结:递归的两个重要因素:
递归调用的过程。
递归终止的条件(出口)。把问题一层一层的分解下去,但不能无限循环下去
注意:递归容易堆栈溢出。递归非常耗费内存,因为需要同时保存成千上百个调用帧,当数据规模较大的时候很容易发生“栈溢出”错误。所以要谨慎使用递归
解答 :
function findRegion(regions, regionName) {
// TODO: 在这里写入具体的实现逻辑
// 需要从树状结构的行政信息中,遍历找到目标区域的行政信息,如输入:成都市,返回 [四川省,成都市]
// 如果所输入的位置信息不存在,则返回 null
let obj = [];
function getsj(regions, regionName) {
for (let re of regions) {
console.log(re);
if (re.name == regionName) {//当找到信息地址时返回(递归的出口)
return obj.push(re.name);
} else {
getsj(re.children, regionName);
}
console.log(obj.length);
if(obj.length){//递归完成后结束后会继续向上一层一层执行
obj.unshift(re.name)
return;
}
}
};
getsj(regions,regionName);
if(obj.length==0){
return null;
}
return obj;
}
module.exports = findRegion; // 检测需要,请勿删除
本文主要讲解了有关递归在平时应用的使用