递归的理解(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']
最新评论