递归算法实例
递归算法,是指在函数或子过程的内部,直接或者间接地调用自己的算法。
举例:
已知数组 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,递归的强大好处将更加明显。然而,递归算法逻辑稍显复杂,使用不慎,轻则影响性能,重则瘫痪程序。