zoukankan      html  css  js  c++  java
  • js递归函数使用介绍

    所谓的递归函数就是在函数体内调用本函数。
    使用递归函数一定要注意,处理不当就会进入死循环。递归函数只有在特定的情况下使用 ,比如阶乘问题

    一个10以内的阶乘,js递归函数实例代码: 

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
    <html xmlns="http://www.w3.org/1999/xhtml"> 
    <head> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
    <title>js中递归函数的使用</title> 
    <script type="text/javascript"> 
    function f(num){ 
    if(num<1){ 
    return 1; 
    }else{ 
    return f(num-1)*num; 
    } 
    } 
    </script> 
    </head> 
    <body> 
    <script type="text/javascript"> 
    alert("10!的结果为:"+f(10)); 
    </script> 
    </body> 
    </html> 

    js递归函数调用自身时的保险方式。 

    来自js高级程序设计 (www.jbxue.com 脚本学堂)
    一个典型阶乘递归函数:

    function fact(num){ 
    if (num<=1){ 
    return 1; 
    }else{ 
    return num*fact(num-1); 
    } 
    }

    以下代码可导致出错: 

    var anotherFact = fact;
    fact = null;
    alert(antherFact(4)); //出错

    由于fact已经不是函数了,所以出错。
    用arguments.callee可解决问题,这是一个指向正在执行的函数的指针。
    新的函数为:

    function fact(num){ 
    if (num<=1){ 
    return 1; 
    }else{ 
    return num*arguments.callee(num-1); //此处更改了。 
    } 
    } 
    var anotherFact = fact; 
    fact = null; 
    alert(antherFact(4)); //结果为24.

    JS普通递归的改进

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

    function factorial(num) 
    { 
    if(num<=1) 
    { 
    return 1; 
    } 
    else 
    { 
    return num * factorial(num-1); 
    } 
    }

    这是一个经典的阶乘函数。表面看来没有什么问题,但下面的代码却可能导致它出错。 

    var anotherFactorial = factorial;

    anotherFactorial(4); //输出 24
    factorial = null;
    anotherFactorial (4); //TypeError: Property 'factorial' of object [object Window] is not a function chrome 下测试
    原因在于,定义的函数名,其实是指向函数的一个指针,此时定义了anotherFactorial 也指向了那个函数,所以调用anotherFactorial (4)可以成功的输出24
    此时 factorial = null; 那么执行定义函数的引用就剩下了anotherFactorial,那么在调用anotherFactorial(4)就会显示以上的错误的信息。
    此时可以使用arguments.callee来替代函数定义中的 factorial,
    函数的定义变成:

    function factorial(num) 
    { 
    if(num<=1) 
    { 
    return 1; 
    } 
    else 
    { 
    return num * arguments.callee(num-1); 
    } 
    } 

    使用上面的4行测试代码,最后一行测试代码成功输出24.

  • 相关阅读:
    一个故事告诉你,数据分析如何给企业带来价值
    【CS231n】斯坦福大学李飞飞视觉识别课程笔记(九):最优化笔记(上)
    区块链P2P网络详细讲解
    互联网协议入门
    BitTorrent DHT 协议中文
    基于侧链的P2P网络设计
    【转】P2P-BT对端管理协议
    P2P网络与BitTorrent技术简介
    【COCOS2DX-LUA 脚本开发之四】使用tolua++编译pk创建自定义类
    爱创课堂每日一题第五十四天- 列举IE 与其他浏览器不一样的特性?
  • 原文地址:https://www.cnblogs.com/cfinder010/p/3936332.html
Copyright © 2011-2022 走看看