zoukankan      html  css  js  c++  java
  • JS_高程7.函数表达式(2)递归

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

     1 //递归实现阶乘
     2 function factorial(num){
     3     if(num <= 1){
     4         return 1;
     5     }else{
     6         return num * factorial(num - 1);
     7     }
     8 }
     9 
    10 console.log(factorial(4));//24

    #  正常情况下,以上函数是没有问题的,但是如果出现以下操作,会出现问题。原因是即使先把factorial保存到anotherFactorial变量后,再将factorial置为null,但是当我们在调用anotherFactorial的时候,在函数内部,还是需要调用factorial(num - 1),所以报错。

     1 function factorial(num){
     2     if(num <= 1){
     3         return 1;
     4     }else{
     5         return num * factorial(num - 1);
     6     }
     7 }
     8 
     9 var anotherFactorial = factorial;
    10 factorial = null;
    11 console.log(anotherFactorial(4));//报错 :Uncaught TypeError: factorial is not a function

    #  可以使用arguments.callee 解决以上问题。arguments.callee 是一个指向正在执行的函数的指针,可以用它来实现函数的递归调用。

     1 function factorial(num){
     2     if(num <= 1){
     3         return 1;
     4     }else{
     5         return num * arguments.callee(num - 1);
     6     }
     7 }
     8 
     9 var anotherFactorial = factorial;
    10 factorial = null;
    11 console.log(anotherFactorial(4));//24

    #  但是严格模式下,不能通过脚本访问arguments.callee 所以会报错:Uncaught TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them..

    #  可以使用命名函数表达式实现以上效果,在严格模式和非严格模式都可以实现。

     1 var factorial = (function f(num){
     2     if(num <= 1){
     3         return 1;
     4     }else{
     5         return num * f(num-1);
     6     }
     7 });
     8 
     9 var anotherFactorial = factorial;
    10 factorial = null;
    11 console.log(anotherFactorial(4));//24

    #  

    请实现一个fibonacci函数,要求其参数和返回值如下所示:
    /**
    *@desc: fibonacci
    *@param: count {Number}
    *@return: result {Number} 第count个fibonacci值,计数从0开始
    fibonacci数列为:[1, 1, 2, 3, 5, 8, 13, 21, 34 …]
    则getNthFibonacci(0)返回值为1
    则getNthFibonacci(4)返回值为5
    */

     1 var fib = (function fun(count){
     2     if(isNaN(count) || count < 0){
     3         return 0;
     4     }else{
     5         if(count <= 1){
     6             return 1;
     7         }else{
     8             return fun(count-1) + fun(count - 2);
     9         }
    10     }
    11 });
    12 console.log(fib(0));//1
    13 console.log(fib(4));//5
  • 相关阅读:
    python logging模块
    mysql数据库的导出与导入
    requests请求高德地图api
    navicat连接阿里云ESC里的数据库
    ubantu+nginx+uwsgi+django部署
    linux小命令
    部署完的Django项目升级为HTTPS
    python常用模块
    python基础18——二分法&面向过程&匿名函数
    emmm......就当练习了系列15
  • 原文地址:https://www.cnblogs.com/LinSL/p/7373366.html
Copyright © 2011-2022 走看看