javascript递归、循环、迭代、遍历和枚举概念
〓递归(recursion)在数学与计算机科学中,是指在函数的定义中使用函数自身的方法。递归一词还较常用于描述以自相似方法重复事物的过程。例如,当两面镜子相互之间近似平行时,镜中嵌套的图像是以无限递归的形式出现的。
可以理解为:指的是一个函数不断调用自身的行为。
语言例子(Language examples):从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢? “从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢? “从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?……””
编程例子(Programming examples):各语言编写的一个递归例子,函数或过程会无限调用自身。理论上说它永远不会结束,实际上因为内存限制它会陷入死循环并崩溃,这种递归叫做无穷递归
递归函数(Recursion function):是在一个函数通过名字调用自身的情况下构成的,
js例子:
|
1
2
3
4
5
6
7
8
9
10
11
|
function man(num){
if(num<=1){
return 1;
}else{
return num*man(num-1); //调用了自身
}
}
var woman = man; //变量woman引用函数man
man = null;
alert(woman(6)); //报错,man is not a function
|
将man函数保存在变量woman中,然后将man变量设置为null,结果指向原始函数的引用就剩下一个,在调用woman()时,由于必须执行man(),而man已经不再是函数,所以导致出现了错误,
在这种情况下,使用arguments.callee可以解决问题arguments.callee是一个指向正在执行的函数的指针,因此可以用它来实现对函数的递归调用,
例如:
|
1
2
3
4
5
6
7
8
9
10
11
|
function man(num){
if (num <= 1) {
return 1;
}else {
return num * arguments.callee(num - 1); //通过使用arguments.callee代替函数名,可以确保无论怎么样调用函数都不会出问题
}
}
var woman = man; //变量woman引用函数man
man = null;
alert(woman(6)); // 720
|
〓循环(loop):指的是在满足条件的情况下,重复执行同一段代码。一般语言都会有三种类型的循环语句:for语句、while语句和do While语句。
可以理解为:循环就是迭代(重复)一些命令的代码块, 如果循环控制条件不满足的话, 就结束循环.
语言例子(Language examples):将一段音乐或声音反覆播放数次(无限次/无穷循环)。地球自转一次是一天,地球公转一次是一年。而人的年龄由于地球公转,相应在每次循环时,在原来的基础上增加了一岁。
JavaScript for循环例子:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
/*
* for语句是一种前测试循环语句,但它具有在执行循环之前初始化变量和定义循环后要执行的代码的能力,for语句语法:
* 语法:for (initialization; expression; post-loop-expression) statement
* Small details:
* 1.for循环的变量初始化表达式中,也可以不使用var关键字。该变量的初始化可以在外部执行。(var i; for(i=0;i<count;i++){ do something})
* 2.使用while循环做不到的,使用for循环同样也做不到。也就是说for循环只是把循环有关的代码集中在了一个位置
* 3.for语句中的初始化表达式,控制表达式和循环后表达式都是可选的,如果省略就会是一个无限循环。(for(;;){dosomething})
*
*/
var count = 10;
for(var i = 0; i<count; i++){ //变量i的初始值为0,只有当条件表达式(i<count)返回true的情况下才会进入for循环,
alert(i);
}
//也可以用while语句来模仿上面for循环语句功能,following code:
var count= 10;
var i =0;
while (i < count){
alert(i);
i++;
}
//由于ECMAScript中不存在块级作用域,因此循环内部定义的变量可以在外部访问到,following code:
var count = 10;
for(var i = 0; i<count; i++){
alert(i);
}
alert(i); // 显示循环完成后变量i的值为10,是因为即使i是在循环内部定义的一个变量,但在循环外部仍然可以访问到它。
//只给出控制表达式实际上就是把for循环转换成了while循环,following code:
var count = 10;
var i = 0;
for(;i<count;){
alert(i);
i++;
}
|
JavaScript while循环例子:
|
1
2
3
4
5
6
7
8
9
10
|
/*
* while语句属于前测试循环语句,也就是说,在循环体内的代码被执行之前,就会对出口条件求值。因此,循环体内的代码有可能永远不会被执行。
* 语法:while(expression) statement
*/
var i = 0;
while(i < 10){
i += 2;
alert(i); //2.4.6.8.10 变量i初始值为0;每次循环都会递增2,只要i的值小于10,循环就会继续下去。
}
alert(i); //10
|
JavaScript do while循环例子:
|
1
2
3
4
5
6
7
8
9
10
11
12
|
/*
* do-while语句是一种后测试循环语句,只有在循环体中的代码执行之后,才会测试出口条件。
* 也就是说,在对条件表达式求值之前,循环体内的代码至少会被执行一次
* 语法:do{ statement } while(expression);
* Small details:do-while这种后测试循环语句常用于循环体中的代码至少要被执行一次的情形。
*/
var i = 0;
do {
i += 2;
alert(i); //2.4.6.8.10
} while (i < 10);
alert(i); // 10
|
〓迭代(iterate),指的是按照某种顺序逐个访问列表中的每一项
可以理解为:遍历一个集合,把集合里的每个元素都遍历一边。有时候,迭代也会指循环执行,反复执行的意思。(这个迭是高潮迭起的迭!对迭代的理解有限,如果想详细了解,自己search!)
迭代算法:是用计算机解决问题的一种基本方法。它利用计算机运算速度快、适合做重复性操作的特点,让计算机对一组指令(或一定步骤)进行重复执行,在每次执行这组指令(或这些步骤)时,都从变量的原值推出它的一个新值
语言例子(Language examples):见http://www.hudong.com/wiki/%E8%BF%AD%E4%BB%A3
js例子:
|
1
2
3
4
5
6
7
8
9
10
11
12
|
/*
* 迭代语句又叫循环语句,声明一组要反复执行的命令,直到满足了某些条件为止。循环通常用于迭代数组的值,或者执行重复的算术任务
* for-in语句是一种精确的迭代语句,可以用来枚举对象的属性。
* 语法:for (property in expression) statement
*/
var arr=['music','video','adult movie','adult video'];
for(key in arr)
{
// key可以理解下标,就像php中键数组key的键值一样
alert(arr[key]);
}
|
〓遍历(traversal),是树形结构的一种重要运算,指的是按照一定的规则访问树形结构中的每个节点,而且每个节点都只访问一次。
可以理解为:遍历,是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问。或者理解为按一定的次序系统地访问结构中的所有结点,使每个结点只被访问一次。
js遍历json数组的例子:
〓枚举(enumeration),在数学和计算机科学理论中,一个集的枚举是列出某些有穷序列集的所有成员的程序,或者是一种特定类型对象的计数。这两种类型经常(但不总是)重叠。枚举是一个被命名的整型常数的集合!
语言例子(Language examples):就是指一一列举,例如表示星期的SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY,就是一个枚举。
javascript递归、循环、迭代、遍历和枚举概念的更多相关文章
- Map循环/迭代/遍历效率、性能问题。
项目开发完毕,为了找点事打发一下时间,于是用findBugs插件对当前完工的项目进行扫描,发现了很多问题.其中有个关于性能的问题,在这里记录一下. 提示信息为:Inefficient use of k ...
- Java高频经典面试题(第一季)五:递归与迭代
编程题: 有n步台阶, 一次只能上 1步 或 2步, 共有多少种走法? 递归 循环迭代 递归: package will01; import org.junit.Test; public class ...
- 再谈循环&迭代&回溯&递归&递推这些基本概念
循环:不断重复进行某一运算.操作. 迭代:不断对前一旧值运算得到新值直到达到精度.一般用于得到近似目标值,反复循环同一运算式(函数),并且总是把前一 次运算结果反代会运算式进行下一次运算 递推:从初值 ...
- 二叉树的遍历(递归,迭代,Morris遍历)
二叉树的遍历: 先序,中序,后序: 二叉树的遍历有三种常见的方法, 最简单的实现就是递归调用, 另外就是飞递归的迭代调用, 最后还有O(1)空间的morris遍历: 二叉树的结构定义: struct ...
- Day 13 可迭代对象,迭代器对象,for循环迭代,生成器对象,枚举对象
一.迭代器概念:# 器:包含了多个值的容器# 迭代:循环反馈(一次从容器中取出一个值)# 迭代器:从装有多个值的容器中一次取出一个值给外界# ls = 'abcdef'ls = [1, 2, 3, 4 ...
- 【Java】 二叉树的遍历(递归与循环+层序遍历)
在[Java] 大话数据结构(9) 树(二叉树.线索二叉树)一文中,已经实现了采用递归方法的前.中.后序遍历,本文补充了采用循环的实现方法.以及层序遍历并进行了一个总结. 递归实现 /* * 前序遍历 ...
- 二叉树的遍历(递归,迭代,Morris遍历)
二叉树的三种遍历方法: 先序,中序,后序,这三种遍历方式每一个都可以用递归,迭代,Morris三种形式实现,其中Morris效率最高,空间复杂度为O(1). 主要参考博客: 二叉树的遍历(递归,迭代, ...
- 【算法】二叉树、N叉树先序、中序、后序、BFS、DFS遍历的递归和迭代实现记录(Java版)
本文总结了刷LeetCode过程中,有关树的遍历的相关代码实现,包括了二叉树.N叉树先序.中序.后序.BFS.DFS遍历的递归和迭代实现.这也是解决树的遍历问题的固定套路. 一.二叉树的先序.中序.后 ...
- c# 使用递归 循环遍历导航树结构 并解析
1.数据书库结构 1 家用电器 0 一级菜单 2 手机.数码.京东通信 0 一级菜单 3 电脑.办公 0 一级菜单 4 家具.家居.厨房 0 一级菜单 5 男装.女装.童装.内衣 0 一级菜单 6 个 ...
随机推荐
- L脚本语言语法手冊 0.10版
L脚本语言语法手冊 0.10版 简 介 L脚本语言是一个轻量级的,旨在接近自然语言的编程语言,眼下支持在中文.英文基础上的编程.并可扩展为随意语种.L脚本语言的语法结构简单.程序结构相对 ...
- [翻译] YLGIFImage 高效读取GIF图片
YLGIFImage 高效读取GIF图片 https://github.com/liyong03/YLGIFImage Asynchronized GIF image class and Image ...
- 【GISER&&Painter】Chapter02:WebGL中的模型视图变换
上一节我们提到了如何在一张画布上画一个简单几何图形,通过创建画布,获取WebGLRendering上下文,创建一个简单的着色器,然后将一些顶点数据绑定到gl的Buffer中,最后通过绑定buffer数 ...
- oc 第五天(内存管理)
OC的重点: 内存管理 1 基本原理 OC的内存回收机制是和JAVA的自动回收机制是不同的,它有两种模式,或者准确的说是同 一种模式的两种不同体现,下面简单总结下. 1手动内存回收 ...
- go语言基础之输入的使用
1.输入的使用 第一种写法:fmt.Scanf("%d", &a) 第二种写法:fmt.Scan(&a) 示例: package main //必须有一个main包 ...
- 关于docker的15个小tip
1. 获取最近运行容器的id 这是我们经常会用到的一个操作,按照官方示例,你可以这样做(环境ubuntu): $ ID=$(docker run ubuntu echo hello world) he ...
- 【架构】OpenResty相关资料
OpenResty最佳实践 在2012年的时候,我加入到奇虎360公司,为新的产品做技术选型.由于之前一直混迹在python圈子里面,也接触过nginx c模块的高性能开发,一直想找到一个兼备pyth ...
- (剑指Offer)面试题43:n个骰子的点数
题目: 把n个骰子仍在地上,所有骰子朝上一面的点数之和为s.输入n,打印出s的所有可能的值出现的概率. 思路: s可能出现的值的范围为:n--6*n 1.全排列 回溯法枚举n个骰子(6面)的全排列,然 ...
- AUC(Area Under roc Curve)学习笔记
AUC是一种用来度量分类模型好坏的一个标准. ROC分析是从医疗分析领域引入了一种新的分类模型performance评判方法. ROC的全名叫做Receiver Operating Character ...
- windows下安装msysgit 及ruby
一:安装msysgit git是目前最流行的软件版本控制软件,在window下通常使用msysgit 下载:http://msysgit.github.io/ 安装:基本上一路默认下一步就行 安装之后 ...