夜猫的个人小站

       继续码起来

关于作者

微博北极熊硬糖
北京海淀区

递归的理解(js举例)

标签   算法   js

//平常说的递归分两种,一种是递归过程,一种是递归结构。
//递归过程就是函数内部调用了本身。
//在递归的过程中往往要通过分解法来减小最初计算的规模。比如一个求和S=1+2+3+^^^n。
//因为S(n)=S(n-1)+n=S(n-2)+n-1+n=^^^^^^^^^
//所以求和函数可以写成:
function S(n){
    if(n==1){return 1};
    return S(n-1)+n;
}
//递归函数内部往往要设置一个变量用来判断何时退出函数的调用,像这里的n==1,否则就会陷入死循环。
//在写递归函数的时候你只要记住你定义了一个函数S(n),这个S能求前n项和,那么要求前n项和,就得求前n-1项和。不停的分解到n==1.

//还有一种就是递归结构。比如平时用的数组。
var a=[1,2],b=3,c='dddddd';
var arr=[a,b,c];
//数组arr内的每个元素有可能是一个数字,一个字符串,也有可能还是一个数组。
//那么当你想遍历这个数组,将数组内的每个数字,字符全部取出,按顺序排列。
//使得新的数组不再含有数组,他的每个元素是一个基本数据类型:number,string,boolean,null
//那么对于这种递归结构,最好的遍历方法就是用递归函数解决。

//list函数能列出数组内所有元素,具体怎么实现不用管
function list(array){
    return iter([],0,array)
}

//iter函数负责遍历数组array
function iter(result,n,array){
    if(n==array.length){return result};
    if (array[n] instanceof Array){//如果遍历的数组元素是个数组,那就用list函数列出它的所有项。
        Array.prototype.push.apply(result,list(array[n]));
        return iter(result,n+1,array);
    }else{
        Array.prototype.push.call(result,array[n]);
        return iter(result,n+1,array);
    }
}

list(arr)//输出arr=[1,2,3,'dddddd']

最新评论

发表评论
回到顶部