JavaScript语言精粹4递归(汗诺塔游戏寻常解)及作用域

递归函数,就是直接或间接的调用自身的一种函数。把问题,分解成一组相似的子问题,每个问题都用一个一般的方式解决,即寻常解。即函数调用,自身,去解决自身子问题。

经典的递归案例,汗诺塔游戏

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Recursion递归</title>
 6 </head>
 7 <body>
 8
 9 </body>
10 </html>
11 <script type="text/javascript">
12 /*
13     ‘汗诺塔‘游戏
14     规则:把两个圆盘一个小在上,大在下,把小,大圆盘经过辅助柱子,移动到目标柱,必须上小下大的圆盘堆叠顺序
15
16     对每个圆盘来看: 从一个柱子移动到另一个柱子的过程!
17
18     disc圆盘个数即编号  调用方法时,传入的参数,对应,左,中,右,柱子名。src左  aux中 dst右
19
20     disc = 2 (圆盘2,即最大的圆盘,圆盘1即比2编号小一号,圆盘1)的过程:
21
22     圆盘1 移动到 aux
23     圆盘2 移动到 dst
24     圆盘1 移动到 dst
25
26     即最大的圆盘,圆盘1即比2编号小一号圆盘的过程:
27        Move disc1 from Src to Aux
28        Move disc2 from Src to Dst
29        Move disc1 from Aux to Dst
30
31
32     disc = 3
33     圆盘:     -1
34              --2
35              ---3
36
37 */
38     var i=0;
39     var hanoi = function(disc,src,aux,dst){
40         //disc圆盘号,即数量,当0即方法即为空,不会造成死循环
41         if(disc > 0){
42             i++;
43             //注意传入参数,此时目标柱,辅助柱
44             hanoi(disc-1,src,dst,aux);//disc=1 0>0 false
45             //方法是,圆盘从源柱,移动目标柱子
46             document.writeln(‘Move disc ‘+disc+‘ from ‘+src+‘ to ‘ + dst+‘</br>‘);
47             hanoi(disc-1,aux,src,dst);
48         }
49     };
50
51     // hanoi (2,‘Src‘,‘Aux‘,‘Dst‘);
52     // console.log(i);
53     // i=0;
54     // document.write(‘</br>‘);
55     // hanoi (3,‘Src‘,‘Aux‘,‘Dst‘);
56     // console.log(i);
57     //打印,所需要移动,最短步骤的值
58     var print_count = function(hanoi){
59             console.log(i);
60             i=0;
61             document.write(‘</br>‘);
62         };
63
64     print_count(hanoi(2,‘Src‘,‘Aux‘,‘Dst‘));
65     print_count(hanoi(3,‘Src‘,‘Aux‘,‘Dst‘));
66
67 </script>

打印值时,如果在hanoi方法内定义i,移动步数,则在hanoi方法外,i是未定义的。如果在hanoi方法打印i,又不是需要的值。

需要一个,调用一次hanoi,对应disc编号圆盘数量,输出i,即window.hanoi(2,‘Src‘,‘Aux‘,‘Dst‘)后,i清零。暂时写了整个print_count方法

作用域,控制变量的可见性和生命周期

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>函数作用域</title>
 6
 7 </head>
 8 <body>
 9
10 </body>
11 </html>
12 <script type="text/javascript">
13     var foo = function(){
14         //在一个函数内部,任何位置定义的变量,在该函数内部任何地方可见
15         var a =3,b =5;
16         var bar = function(){
17             var b = 7,c = 11;//此时a=3,b =7 c =11
18             a += b+c;// a =21 b =7 c=11
19         };
20         //定义在函数中的参数和变量在函数外部是不可见的
21         //bar 中的 b c 是不可见的
22         //此时调用函数后 a= 21
23         bar();// a = 21 b = 5 c 没有定义 undefined
24         // console.log(a,b,c);// c is not defined
25         console.log(a,b);
26
27     };
28     foo();
29     //    foo函数外,a是不可见的
30     // console.log(foo(),a);// a is not defined
31 </script>
时间: 2025-01-05 15:19:46

JavaScript语言精粹4递归(汗诺塔游戏寻常解)及作用域的相关文章

javascript语言精粹----笔记【转载】

javascript语言精粹----笔记 1.6种值会为假(==false),分别是false,null,undefined,' ',0,NaN 2.typeof有6种值,分别是'number','string','boolean','undefined','function','object';其中typeof(null),结果是'object' 3.number类型总是64位浮点数,两个整数相除也可能出现非整数结果 4.如果第一个运算数的值为假,那么运算符&&产生它的第一个运算数的值.

JavaScript语言精粹 笔记02

函数函数对象函数字面量调用参数返回异常给类型增加方法递归作用域闭包回调模块级联套用记忆   函数 1 函数对象 在JS中函数就是对象.对象是“名/值”对的集合并拥有一个连接到原型对象的隐藏连接.对象字面量产生的对象连接到Object.prototype.函数对象连接到Function.prototype(该原型本身连接到Object.prototype).每个函数在创建时附有两个附加的隐藏属性:函数上下文和实现函数行为的代码. 因为函数是对象,所以它可以像任何其他的值一样被使用.函数可以存放在变

《JavaScript语言精粹》【PDF】下载

<JavaScript语言精粹>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230382204 内容简介 javascript曾是"世界上最被误解的语言",因为它担负太多的特性,包括糟糕的交互和失败的设计,但随着ajax的到来,javascript"从最受误解的编程语言演变为最流行的语言",这除了幸运之外,也证明了它其实是一门优秀的语言.douglascrockford在本书中剥开了javascrip

JavaScript语言精粹 笔记01

内容比较简单,只是从头梳理一下JS的知识 语法空白标识符数字字符串语句 对象对象字面量检索更新引用原型反射枚举删除减少全局变量污染  语法 1 空白 空白可能表现为格式化字符或注释的形式.空白通常没有意义,但是偶尔必须用它来分割字符序列,否则它们就会被合并成一个单一的符号.例如: var that = this; var 和that之间的空格是不能去掉的,其他的空格都可以被移除. JS提供两种注释: /* */ // 建议使用//,因为/* */中要注释的内容可能包括字符 */ 而报错,例如:

《javascript语言精粹》——第3章

第三章:对象: 属性名字:可以是包括空字符串在内的任意字符串: 属性值:是除undefined值之外的任何值; [1].对象字面量: var obj={}; //空对象 var newobj={ name:"小明", age:17, school:{ class:"一班" } }; 属性名可加引号,也可不加 [2].检索 newobj["name"] //小明 newobj.age  //17  推荐使用.可读性更加好,紧凑 newobj[&qu

《javascript语言精粹》——第4章函数

函数就是对象 [1].函数字面量即(函数表达式)包括四部分: 第一部分:保留字function: 第二部分:函数名称,可有可无: 第三部分:包围在一对小括号的一组参数,参数用逗号隔开: 第四部分:包围在一对花括号的一组语句,是函数的主体: 函数字面量可以出现在任何允许表达式出现的地方. [2].调用有四种调用模式: 除了声明时定义的形参,每个函数接收附加的的参数:this和arguments  ,this的值取决于调用的模式. 第一种:方法调用模式: var aa={ value:0, incr

JavaScript语言精粹笔记

JavaScript语言精粹笔记 掌握语言的每个特性可以让你出风头,但是并不推荐,因为一部分的特性带来的麻烦可能远超本身的价值.正如书中所言,坏的材料并不能雕刻出好的作品,要成为一名更好的程序员,要取其精华去其糟粕.当你知道要做什么的时候,它还能表现的更好,编程时一件相对困难的事情,绝不应该在懵懂的状态下开始编程之旅. JS中的注意为//或者/*content*/,注释一定要精确地描述代码,不然没有用的注释比没有注释更糟糕. JS中的代码块不会创建新的作用域,因此变量应该被定义在函数的头部,而不

JavaScript语言精粹 笔记03

继承伪类对象说明符原型函数化部件 继承 JS不是基于类的,而是基于原型的,这意味着对象直接从其他对象继承. 1 伪类 JS提供了一套丰富的代码重用模式,它可以模拟那些基于类的模式,因为JS实际上没有类,所以把模拟的类称为伪类.我们可以定义一个构造器并扩充它的原型: var Mammal = function (name) { this.name = name; }; Mammal.prototype.get_name = function ( ) { return this.name; }; M

javascript 语言精粹 笔记推荐。。

http://www.cnblogs.com/Cohlint/archive/2012/11/26/2788790.html 这篇javascript 语言精粹 学习笔记不错..不过看上去就是读书笔记,没有深入研究某个点..比如闭包..我还是不懂噢.. 比如17条:“add_the_handles 函数目的是给每个时间处理器一个唯一值(i).它未能达到目的是因为事件处理器函数绑定了变量i,而不是函数在构造时的变量i的值.” 这是原书的翻译过来的理解,但是感觉还是很艰涩,不太理解. 闭包这个变量作