27岁,山西运城人,职业电商经理人,前端开发工作者,从事过网站建设、网络推广、SEO、SEM、信息流推广、二类电商、网络运维、软件开发,等相关电商工作,经验较为丰富,小米技术社区致力于为广大从事Web前端开发的人员提供一些力所能及的引导和帮助 ...[更多]
E-mail:mzze@163.com
Q Q:32362389
W X:xiaomi168527
27岁,山西运城人,职业电商经理人,网络工程师兼运维,从事过运营商网络建设,企业网络建设、优化。数据中心网络维护等通过,经验丰富,座右铭:当自己休息的时候,别忘了别人还在奔跑。 ...[更多]
大于花一样的年龄,河南郑州是我家,2010年在北京接触团购网,2011年进入天猫淘宝一待就是四年,如今已经将设计走向国际化(ps:误打误撞开始进入阿里巴巴国际站的设计,嘿嘿)五年电商设计,丰富经验,从事过天猫淘宝阿里各项设计,店铺运营,产品拍摄;我将我的经历与您分享是我的快乐!座右铭:越努力越幸运! ...[更多]
E-mail:97157726@qq.com
Q Q:97157726
一句话介绍递归:函数内部自己调用自己,或者在自己函数调用的下级函数中调用自己
常用环境:根据已知条件 推导结果(递归的思想就是将一个未知问题转换为一个已解决的问题来实现)
注意:
(1)递归必须要有判断条件,不加判断会造成死循环
(2)递归函数体内需要递归前面的n-1,而不能是n+1
(3)递归层数不能太深,数据太大,递归次数太多,会导致内存占用过高。
function fn1 () { console.log(111) fn2() console.log('fn1') } function fn2 () { console.log(222) fn3() console.log('fn2') } function fn3 () { console.log(333) fn4() console.log('fn3') } function fn4 () { console.log(444) console.log('fn4') } fn1() //递归执行结果为 111 222 333 444 fn4 fn3 fn2 fn1
function sum(n){ if(n>1){ return n + sum(n-1); }else{ return 1; } } var jieguo = sum(5); //到连加1-5的和结果 console.log(jieguo);
0 1 2 3 4 5 6 7 8 9 10
分析规律: 当前数字=前一个数字+1;特殊情况 n =0
f1(n) = f1(n-1) + n; function f1(n){ if(n == 0){ return 0; //有结束判断条件(递归出口) }else{ return n + f1(n-1); } } f1(100);
0 1 1 2 3 5 8 13 21
分析规律:当前数字=前一个数字+前二个数字;特殊情况:0 1
function f(z){ if(z <= 1){ return z; //有结束判断条件(递归出口) }else{ return f(z-1) + f(z-2); } } f(20);
html结构:
<div> <div>1 <div class="c">2</div> <div>3</div> </div> <div class="c">4</div> <div>5 <div>6</div> <div class="c">7</div> </div> <div>8</div> </div>
分析
1. 实现一个方法byClass()需要的参数是:
node: 在某个节点上寻找元素
className: 需要寻找的className
arr: 找到的元素存储到这个数组中
2. 遍历 node 的子节点,
3. 查看这个子节点是否还有子节点,如果没有直接存储到数组中,如果有就继续递归
复制代码
var arr = []; function byClass(node, className, arr){ //得到传入节点的所有子节点 var lists = node.childNodes; for(var i = 0;i< lists.length;i++){ //判断是否有相同className元素 if(arr[i],className == className){ arr.push(arr[i]); } //判断子节点是否还有子节点 if(arr[i].childNodes.length > 0){ byClass(arr[i],className,arr); } } }
本站内容均为小米原创,转载请注明出处:小米技术社区>> JavaScript递归的概念、常用环境、递归注意事项和递归案例