Js高级---递归(一看就会)
来源:互联网 发布:安卓7.0 电量优化 编辑:程序博客网 时间:2024/05/29 14:04
Js高级------递归
在看递归之前,你首先要明白"栈"的知识,知道的太多不好,你只需记住 栈---“后进先出”,就能了。
递归的概念(递归的意思就是函数自己调用自己本身,或者在自己函数调用的下级函数中调用自己。)
在程序中函数直接或间接调用自己
1. 直接调用自己
2. 间接调用自己
· 跳出结构,有了跳出才有结果
递归的思想
· 递归的调用,最终还是要转换为自己这个函数
1. 如果有个函数foo,如果他是递归函数,到最后问题还是转换为函数foo的形式
2. 递归的思想就是将一个未知问题转换为一个已解决的问题来实现
简单的理解:递归就是程序运行到某个点的时候,调用自身,这个时候,之前没运行完的程序会暂时不运行,等到下一层调用完了之后再运行。这个正是符合栈的先进后出。这个时候就会有个进栈,等到下一层调用完运行了,之后就可以出栈继续运行
function foo(){
...foo(...)...
}
递归的步骤(技巧)
1. 假设递归函数已经写好
2. 寻找递推关系
3. 将递推关系的结构转换为递归体
4. 将临界条件加入到递归体中
1.求 1,3,5,7,9,...第n项的结果和前n项和,序号从0开始function foo(n){ if(n == 1){ Return 1; }else{ return foo(n) = sum(n-1)+2; } }
2. 求8的阶乘
1.求 1,3,5,7,9,...第n项的结果和前n项和,序号从0开始function foo(n){ if(n == 1){ return 1; }else{ return foo(n) = sum(n-1)+2; } }
例2:递归实现字符串逆序
比如:s=“abcdef”,逆序后变为“fedcba”
例3. 汉诺塔问题
深拷贝,使用递归方式
概念:1.如果拷贝的时候,将数据的所有引用结构都拷贝一份,那么数据在内存中独立就是深拷贝(内存隔离,完全独立)
2. 如果拷贝的时候, 只针对当前对象的属性进行拷贝, 而属性是引用类型这个不考虑,那么就是浅拷贝
3. 拷贝: 复制一份. 指将对象数据复制.
4. 在讨论深拷与浅拷的时候一定要保证对象的属性也是引用类型.
实现方法:
5. 如果要实现深拷贝那么就需要考虑将对象的属性,与属性的属性,都拷贝过来
6. 分析(2个参数,简单实现)
1. 假设已经实现 clone ( o1, o2),将对象o2 的成员拷贝一份交给o1
2. 递推关系
* 混合方法,将o2 的成员拷贝到o1 中
```
function clone( o1, o2){
for(var key in o2){
o1[key] = o2[key];
}
}
```
* 假设方法已经实现,如果o2[key] 是对象
* 继续使用这个方法
* 需要考虑 o2[key] 是引用类型,再一次使用clone函数
* 如果 o2[key] 不是引用类型,那么直接赋值
3. 临界条件
* 因为是 for in 循环,没有成员遍历时,自动结束
4. 递归函数
function clone(o1,o2){
for(var key in o2){
if(typeof o2[key] == 'object'){
o1[key] = {};
clone(o1[key],o2[key])
}else{
o1[key] = o2[key];
}
}
}复杂实现(一个参数)
原理: clone(o) = new Object;返回一个对象
递归 函数
function clone(o){
var temp = {};
for(var key in o){
if(typeof o[key] == 'object'){
temp[key] = clone(o[key]);
}else{
temp[key] = o[key];
}
}
return temp;
}
# 使用递归实现 getElementsByClassName
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);
}
}
}
- Js高级---递归(一看就会)
- JS高级---继承(一看就会)
- JS高级---闭包(一看就懂)
- JS高级---原型到原型链(一看就懂)
- sed 一看就会
- JS高级---原型链(一看就懂,但18岁以下请绕道)
- JS高级---argument详解(一看机会)
- 正则表达式 一看就会
- Android DataBinding一看就会
- android + eclipse + 后台静默安装(一看就会)
- android + eclipse + 后台静默安装(一看就会)
- android + eclipse + 后台静默安装(一看就会)
- 再按一次退出(一看就会)
- 全排列(超详解)一看就会
- 一看就会,一看就懂,快速上手Git
- 超简单的js、jq皮肤切换,一看就会,不会打我
- android中的log讲解(一看就会)
- HTML在线编辑器。。一看就会的
- 免费的论文查重网站
- ThreadPoolExecutor源码解析
- 动态规划经典入门题目
- PreCreateWindow
- bzoj[NOI2005]维修数列
- Js高级---递归(一看就会)
- android三级缓存访问网络图片
- 一句代码搞定tableView的代理方法
- 操作系统引论
- 5.28
- 使用requests和scrapy模拟知乎登录
- NYOJ 33 蛇形填数
- (项目)AR电子书系统创新实训第三周(2)
- day9协议上限分析