递归算法实例

递归算法,是指在函数或子过程的内部,直接或者间接地调用自己的算法。

举例:

  已知数组 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,递归的强大好处将更加明显。然而,递归算法逻辑稍显复杂,使用不慎,轻则影响性能,重则瘫痪程序。

 

posted @ 2014-12-17 14:51  George-Wayne  阅读(237)  评论(0编辑  收藏  举报