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数组的例子:

<!DOCTYPE html><html> <head> <title> exp </title> <meta charset="utf-8" /> <meta name="keywords" content="" /> <meta name="description" content="" /> <script> function traversal(){ var json = [{ "id": "1", "name": "jalen", "description": "懒的掉渣", "sex": "暂未男性", "parentId": "父id=1" }, { "id": "2", "name": "ryan", "description": "好人,神人", "sex": "标准男性", "parentId": "父id=2" }] var str = ""; for (var i in json) { for (var key in json[i]) { str += json[i][key] + "|"; } } document.form.outputTxt.value = str; } </script> </head> <body> <form name="form"> <a href="#" onclick="traversal();">Click</a> <hr/> <input name="outputTxt" value="" type="text" style="width:800px;height:100px;line-height:100px;"> </form> </body></html>

〓枚举(enumeration),在数学和计算机科学理论中,一个集的枚举是列出某些有穷序列集的所有成员的程序,或者是一种特定类型对象的计数。这两种类型经常(但不总是)重叠。枚举是一个被命名的整型常数的集合!

语言例子(Language examples):就是指一一列举,例如表示星期的SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY,就是一个枚举。

转载:http://blog.csdn.net/wustzbq0713/article/details/46387309

javascript递归、循环、迭代、遍历和枚举概念的更多相关文章

  1. Map循环/迭代/遍历效率、性能问题。

    项目开发完毕,为了找点事打发一下时间,于是用findBugs插件对当前完工的项目进行扫描,发现了很多问题.其中有个关于性能的问题,在这里记录一下. 提示信息为:Inefficient use of k ...

  2. Java高频经典面试题(第一季)五:递归与迭代

    编程题:  有n步台阶, 一次只能上 1步 或 2步, 共有多少种走法? 递归 循环迭代 递归: package will01; import org.junit.Test; public class ...

  3. 再谈循环&迭代&回溯&递归&递推这些基本概念

    循环:不断重复进行某一运算.操作. 迭代:不断对前一旧值运算得到新值直到达到精度.一般用于得到近似目标值,反复循环同一运算式(函数),并且总是把前一 次运算结果反代会运算式进行下一次运算 递推:从初值 ...

  4. 二叉树的遍历(递归,迭代,Morris遍历)

    二叉树的遍历: 先序,中序,后序: 二叉树的遍历有三种常见的方法, 最简单的实现就是递归调用, 另外就是飞递归的迭代调用, 最后还有O(1)空间的morris遍历: 二叉树的结构定义: struct ...

  5. Day 13 可迭代对象,迭代器对象,for循环迭代,生成器对象,枚举对象

    一.迭代器概念:# 器:包含了多个值的容器# 迭代:循环反馈(一次从容器中取出一个值)# 迭代器:从装有多个值的容器中一次取出一个值给外界# ls = 'abcdef'ls = [1, 2, 3, 4 ...

  6. 【Java】 二叉树的遍历(递归与循环+层序遍历)

    在[Java] 大话数据结构(9) 树(二叉树.线索二叉树)一文中,已经实现了采用递归方法的前.中.后序遍历,本文补充了采用循环的实现方法.以及层序遍历并进行了一个总结. 递归实现 /* * 前序遍历 ...

  7. 二叉树的遍历(递归,迭代,Morris遍历)

    二叉树的三种遍历方法: 先序,中序,后序,这三种遍历方式每一个都可以用递归,迭代,Morris三种形式实现,其中Morris效率最高,空间复杂度为O(1). 主要参考博客: 二叉树的遍历(递归,迭代, ...

  8. 【算法】二叉树、N叉树先序、中序、后序、BFS、DFS遍历的递归和迭代实现记录(Java版)

    本文总结了刷LeetCode过程中,有关树的遍历的相关代码实现,包括了二叉树.N叉树先序.中序.后序.BFS.DFS遍历的递归和迭代实现.这也是解决树的遍历问题的固定套路. 一.二叉树的先序.中序.后 ...

  9. c# 使用递归 循环遍历导航树结构 并解析

    1.数据书库结构 1 家用电器 0 一级菜单 2 手机.数码.京东通信 0 一级菜单 3 电脑.办公 0 一级菜单 4 家具.家居.厨房 0 一级菜单 5 男装.女装.童装.内衣 0 一级菜单 6 个 ...

随机推荐

  1. iOS: iOS各种设备信息获取

    Author:si1ence Link:http://www.jianshu.com/p/b23016bb97af 为了统计用户信息.下发广告,服务器端往往需要手机用户设备及app的各种信息,下面讲述 ...

  2. 数学图形(2.12)spherical cycloid球面外摆曲线

    查了半天也没搜到其具体的定义,先把脚本代码和截图发下. #http://www.mathcurve.com/courbes3d/cycloidspheric/cycloidspheric.shtml ...

  3. [置顶] OpenJDK源码研究笔记(九)-可恨却又可亲的的异常(NullPointerException)

    可恨的异常 程序开发过程中,最讨厌异常了. 异常代表着程序出了问题,一旦出现,控制台会出现一屏又一屏的堆栈错误信息. 看着就让人心烦. 对于一个新人来讲,遇到异常经常会压力大,手忙脚乱,心生畏惧. 可 ...

  4. jQuery框架开发一个最简单的幻灯效果

    在线演示 在这个课程中,我们将介绍如何使用jQuery来开发一个最简单的图片幻灯效果. 立刻观看互动课程:jQuery框架开发一个最简单的幻灯效果 阅读原文:jQuery框架开发一个最简单的幻灯效果

  5. 首都医科大学附属北京安贞医院全院级PACS系统采购项目[转]

    项目名称:首都医科大学附属北京安贞医院全院级PACS系统采购项目 项目编号:TC140VCF0 采购人名称:首都医科大学附属北京安贞医院 采购人地址:北京市朝阳区安贞里 采购人联系方式:010-644 ...

  6. 使用SimHash进行海量文本去重

    阅读目录 1. SimHash与传统hash函数的区别 2. SimHash算法思想 3. SimHash流程实现 4. SimHash签名距离计算 5. SimHash存储和索引 6. SimHas ...

  7. ES6 class 基本使用

    <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...

  8. JSON格式校验

    <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...

  9. JavaScript数组方法说明

    JavaScript的数组方法有: http://www.w3school.com.cn/jsref/jsref_obj_array.asp 其中:concat.join和slice方法都不会修改原数 ...

  10. 〖Linux〗(2013.08.02)VIM74b+YouCompleteMe,VIM代码编辑器补全能手

    1. 编译和安装vim74b(参考:http://t.cn/zQa8R7h ) sudo apt-get install -y hgsvn libncurses5-dev libgnome2-dev ...