递归算法,是指在函数或子过程的内部,直接或者间接地调用自己的算法。
举例:
已知数组 a=[1,[2,[3,[4,'null']]]], 算法实现数组 b=[4,[3,[2,[1,'null']]]],代码如下:
var tmp = [], a = [1,[2,[3,[4,'null']]]];
function loop(arr){
tmp=[tmp.slice(0)];
tmp.unshift(arr[0]);
if(tmp[1] == ""){
tmp[1]= "null";
}
if(Object.prototype.toString.apply(arr[1]) === '[object Array]'){
loop(arr[1]);
}
return tmp;
}
loop(a);
可以优化一下上述代码,如下:
var tmp = [], a = [1,[2,[3,[4,"null"]]]];
function loop(arr){
tmp=tmp.length?[tmp]:['null'];
tmp.unshift(arr[0]);
if(Object.prototype.toString.apply(arr[1]) === '[object Array]'){
loop(arr[1]);
}
return tmp;
}
loop(a);
实例:如何删除一段长字符串中的多段相同的子字符串?比如删除字符串 str="haha 88wang 88wang jjaks88wang huashd" 中的88:
var targetStr = "";
function strMaker(str) {
//从字符串末端开始检索goodsDescription,并将字符串一分为二
var _index = str.lastIndexOf("88");
if (_index == -1) {
targetStr = str + targetStr;
return;
}
//处理截取的后半段字符串,删除掉goodsDescription,拼接新的字符串
var subStr = str.slice(_index);
subStr = subStr.slice(subStr.indexOf("wang"));
targetStr = subStr + targetStr;
//继续对前半段字符串进行分割截取,重复上述动作
str = str.substr(0, _index);
strMaker(str);
return targetStr;
}
这就是一个典型的递归算法,若将上述嵌套层数增加至N,递归的强大好处将更加明显。然而,递归算法逻辑稍显复杂,使用不慎,轻则影响性能,重则瘫痪程序。