Javascript 递归函数

递归函数就是在函数内部调用它自己。在Javascript 中有很多写法,值得我们学习一下(Javascript太灵活了)。还是用n的 阶乘 来写例子吧.

1. 首先,来看一个最普通 最正常的写法。

        function fac(num) {
            if (num < 2) {
                return 1;
            } else {
               return num * fac(num - 1);
            }
        }
        var temp = fac;
        fac = null;
        alert(temp(5));

但是这种写法有一个问题就是,存在一些特殊场景,我们可能需要把fac函数赋值给其它对象,这时在调用这个对象的时候可能会出现问题。就像上面代码所示的调用。

2. 这时我们使用Javascript中arguments.callee 来解决这种耦合的问题。但是 在严格模式下,不能使用这种方式。

        function fac(num) {
            //"use strict";
            if (num < 2) {
                return 1;
            } else {
                return num * arguments.callee(num - 1);
            }
        }
        alert(fac(5));    

注意:严格模式:在作用域中添加 "use strict" 就进入严格模式。但是  "use strict" 不论前面 后面 还是中间 都不能添加空格,不然无效。

3. 可以使用函数表达式来实现同样的功能。

        var fac = (function f(num) {
            if (num < 2) {
                return 1;
            } else {
                return num * f(num - 1);
            }
        });
        var temp = fac;
        fac = null;
        alert(temp(5));
时间: 2024-10-25 08:27:16

Javascript 递归函数的相关文章

Javascript递归函数

递归函数是在一个函数通过名字调用自身的情况下构成的.如下: function self(num){ if(num<=1){ return 1; } else{ return num*self(num-1); } } 这是一个经典的求阶乘的函数.当在外面调用self(4)是可以得到24 ,但是在下面这种情况下就会出错: var another=self; self=null; alert(anthor(4));//error 因为将self付给another之后,self变为空,当调用anothe

JavaScript递归函数解“汉诺塔”

"汉诺塔"是一个著名的益智游戏.塔上有3根柱子和一套直径各不相同的空心圆盘.开始时柱子上的所有圆盘都按照从小到大的顺序堆叠.目标是通过每次移动一个圆盘到另一根柱子,最终把一堆圆盘移动到目标柱子上,过程中不允许把交大的圆盘放置在较小的圆盘之上. 仔细解读这段话,如果有10个圆盘甚至更多,那操作步骤绝对多到让人震惊,但目标是把一堆圆盘移动到目标柱子上,如果把上面的9个圆盘看成一套,第10个圆盘看成另一套,先移动9个圆盘到另一根柱子上,再把上面8个圆盘看成一套,第9个圆盘看成另一套--依次类

javascript 递归之阶乘

阶乘,即5! = 5*4*3*2*1, 先看传统的做法,利用while循环实现: function factorial(num){ var result = num; if(num<0){ return -1; //负数返回-1 } if(num == 0){ return 1; // 0阶乘为1 } while(num-- >2){ result = result*num; } return result; } javascript递归函数通过它调用其本身,利用递归的思路的话,阶乘的思路应该

Javascript 中的回调函数和递归函数简单实际分析学习

Javascript 中的回调函数和递归函数简单实际分析学习 1 回调函数 所谓回调函数简单理解就是将一个函数做为参数传递给其他的函数供其使用.(只是在js中,因为其它的语言中有指针这个概念). 举一个简单的例子,当我们在统计账单的时候就要整理材料这些,然后就需要计算器,计算器我们想象成为一个可以实现计算的函数.统计账单是另外的另一个函数,当统计账单的时候就会需要计算器这个函数的支持,其实这就是一个简单的回调.可以按这个理解. 下来我借用网上的一个例子: //先定义一个函数fun1 functi

JavaScript中的递归函数问题

学过其他编程语言的都应该会知道递归这个问题,递归函数是在一个函数通过名字调用自身的情况下后构成的. function fac(num){ if(num<=1){ return 1; }else{ return num*fac(num-1); } } 这是一个比较经典的阶乘算法,这个写法就实现我们所说的递归.这个代码看起来是没有什么问题, 在c或者其他编程语言都有这样的描述,但是在JavaScript中有时就会出错.就比如: <span style="white-space:pre&q

JavaScript正则表达式检验与递归函数实际应用

JS递归函数(菲波那切数列) 实例解析: 一组数字:0  1  1  2  3  5  8  13 0  1  2  3  4  5  6  7 sl(0)=0; sl(1)=1; sl(2)=sl(0)+sl(1); sl(3)=sl(1)+sl(2); function sl(i){ if(i==0){ return  0; }else if(i==1){ return  1; }else{ return  sl(i-1)+sl(i-2); } } 正则表达式检验 //校验是否全由数字组成

JavaScript的一个深拷贝的例子——递归函数的实现

今天学到了JS的关于深拷贝和浅拷贝的例子,有些体会. 在JavaScript中,变量的拷贝分为两种,一种是值拷贝,一种是内存地址拷贝,意思是当赋值给变量的只是一个简单的基本数值时,变量与变量之间的储存空间是相互独立,两个变量之间的改变不会相互影响,而当赋值给变量的是一个对象或数组的时候,变量与变量之间的存储空间将会指向同一个内存空间,当某一个变量改变时,内存空间的值也会改变. //值拷贝 var i = 4; var j = i; //内存地址拷贝 var m = {name:'xxx'}; v

JavaScript中递归函数用法需要注意的

<script> function sum(num){ if(num<=1){ return 1; }else{ return num*sum(num-1);//return num*arguments.callee(num-1); //指针 //return 2; } } var sum1=sum; alert(sum1(2)); </script> 上面的代码 在执行时很容易出现问题,执行我们介绍一个方法,arguments.callee,是一个指向正在执行的函数的指针,

Javascript学习笔记:3种递归函数中调用自身的写法

①一般的通过名字调用自身 1 function sum(num){ 2 if(num<=1){ 3 return 1; 4 }else{ 5 return num+sum(num-1); 6 } 7 } 8 9 console.log(sum(5));//15 这种通过函数名字调用自身的方式存在一个问题:函数的名字是一个指向函数对象的指针,如果我们把函数的名字与函数对象本身的指向关系断开,这种方式运行时将出现错误. 1 function sum(num){ 2 if(num<=1){ 3 re