代码改变世界

递归、循环、迭代、遍历和枚举的简单概念描述

2011-05-26 16:19  jalen  阅读(4439)  评论(0编辑  收藏  举报

递归(recursion)在数学与计算机科学中,是指在函数的定义中使用函数自身的方法。递归一词还较常用于描述以自相似方法重复事物的过程。例如,当两面镜子相互之间近似平行时,镜中嵌套的图像是以无限递归的形式出现的。

可以理解为:指的是一个函数不断调用自身的行为。

语言例子(Language examples):从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢? “从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢? “从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?……””

编程例子(Programming examples):各语言编写的一个递归例子,函数或过程会无限调用自身。理论上说它永远不会结束,实际上因为内存限制它会陷入死循环并崩溃,这种递归叫做无穷递归 

递归函数(Recursion function):是在一个函数通过名字调用自身的情况下构成的,

js例子:

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是一个指向正在执行的函数的指针,因此可以用它来实现对函数的递归调用,

例如:

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循环例子:

/*
 * 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循环例子:

/*
 * 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循环例子:

/*
 * 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例子:

/*
 * 迭代语句又叫循环语句,声明一组要反复执行的命令,直到满足了某些条件为止。循环通常用于迭代数组的值,或者执行重复的算术任务
 * 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://zh.wikipedia.org/wiki/%E6%9E%9A%E4%B8%BE

以上都是学习笔记,为了防止记性差,偶尔翻出来看看。并不十分准确,只是个人理解。

PS:文中部分概念性描述摘自互联网,如:wiki 百度百科等等。太多就不一一列举了