JavaScript中递归实现的方法及其区别


Posted in Javascript onSeptember 12, 2017

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

递归实现阶乘函数:

方法一:通过使用函数的名字

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

结果为:24;

但是这种方法实现递归有一个问题,观察以下代码:

function factorial(num){
    if(num<=1){
      return 1;
    }else{
      return num*factorial(num-1);
    }
  }
  var anthorFactorial=factorial;
  console.log(anthorFactorial(4));

结果为:24;

但是:

function factorial(num){
    if(num<=1){
      return 1;
    }else{
      return num*factorial(num-1);
    }
  }
  var anthorFactorial=factorial;
  factorial=null;
  console.log(anthorFactorial(4));

结果为:报错

这是因为:

我们定义的函数名,其实是指向函数的一个指针,定义的anotherFactorial 也指向了那个函数,所以调用anotherFactorial (4)可以成功的输出24

当 factorial = null时,执行定义函数的引用就剩下了anotherFactorial,那么在调用anotherFactorial(4)就会显示以上的错误的信息。

此时可以使用arguments.callee来替代函数定义中的 factorial。

方法二:通过使用arguments.callee

function factorial(num){
    if(num<=1){
      return 1;
    }else{
      return num*arguments.callee(num-1);
    }
  }
  var anthorFactorial=factorial;
  factorial=null;
  console.log(anthorFactorial(4));

结果为:24

arguments.callee是一个指向正在执行的函数的指针,因此可以用arguments.callee来实现对函数的递归调用。通过使用arguments.callee来代替函数名,可以保证在调用函数时无论怎样都不会出现问题。因此,在编写递归函数时,使用argumnts.callee总比使用函数名更加保险。
但是,在严格模式下,不能通过脚本访问arguments.callee,访问这个属性会报错,不过可以通过命名函数表达式来达到相同的效果。

方法三:通过命名函数表达式

var factorial=function f(num){
    if(num<=1){
      return 1;
    }else{
      return num*f(num-1);
    }
  };
  f=null;
  console.log(factorial(4));

这种方式在严格和非严格模式下都有效。

总结

以上所述是小编给大家介绍的JavaScript中递归实现的方法及其区别,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
关于hashchangebroker和statehashable的补充文档
Aug 08 Javascript
JavaScript自定义DateDiff函数(兼容所有浏览器)
Mar 01 Javascript
jQuery Validate 验证,校验规则写在控件中的具体实例
Feb 27 Javascript
JSON中双引号的轮回使用过程中一定要小心
Mar 05 Javascript
JS函数this的用法实例分析
Feb 05 Javascript
angular.js分页代码的实例
Jul 27 Javascript
jQuery插件FusionCharts绘制ScrollColumn2D图效果示例【附demo源码下载】
Mar 22 jQuery
使用jQuery实现购物车结算功能
Aug 15 jQuery
基于vue-resource jsonp跨域问题的解决方法
Feb 03 Javascript
在 Vue 中编写 SVG 图标组件的方法
Feb 24 Javascript
详解ES6数组方法find()、findIndex()的总结
May 12 Javascript
详细聊聊vue中组件的props属性
Nov 02 Vue.js
详解react-native-fs插件的使用以及遇到的坑
Sep 12 #Javascript
React中jquery引用的实现方法
Sep 12 #jQuery
JS+canvas动态绘制饼图的方法示例
Sep 12 #Javascript
详解react-router4 异步加载路由两种方法
Sep 12 #Javascript
JS+canvas绘制的动态机械表动画效果
Sep 12 #Javascript
BootStrap Table实现server分页序号连续显示功能(当前页从上一页的结束序号开始)
Sep 12 #Javascript
Angular 4.0学习教程之架构详解
Sep 12 #Javascript
You might like
AM/FM收音机的安装与调试
2021/03/02 无线电
phpmyadmin里面导入sql语句格式的大量数据的方法
2010/06/05 PHP
WordPress中获取指定分类及其子分类下的文章数目
2015/12/31 PHP
yii的入口文件index.php中为什么会有这两句
2016/08/04 PHP
PHP7新特性
2021/03/09 PHP
javascript 模拟点击广告
2010/01/02 Javascript
iframe 父窗口和子窗口相互的调用方法集锦
2010/12/15 Javascript
JS中关于正则的巧妙操作
2017/08/31 Javascript
JavaScript实现的超简单计算器功能示例
2017/12/23 Javascript
微信小程序之判断页面滚动方向的示例代码
2018/08/30 Javascript
Vuex 模块化使用详解
2019/07/31 Javascript
layui radio点击事件实现input显示和隐藏的例子
2019/09/02 Javascript
[00:35]可解锁地面特效
2018/12/20 DOTA
python调用机器喇叭发出蜂鸣声(Beep)的方法
2015/03/23 Python
Python爬虫之正则表达式基本用法实例分析
2018/08/08 Python
Python 中的lambda函数介绍
2018/10/10 Python
python 找出list中最大或者最小几个数的索引方法
2018/10/30 Python
Python计算库numpy进行方差/标准方差/样本标准方差/协方差的计算
2018/12/28 Python
python如何实现不用装饰器实现登陆器小程序
2019/12/14 Python
DRF框架API版本管理实现方法解析
2020/08/21 Python
python 爬取B站原视频的实例代码
2020/09/09 Python
Python实现中英文全文搜索的示例
2020/12/04 Python
行政专员工作职责
2013/12/22 职场文书
项目开发计划书
2014/01/09 职场文书
关于毕业的广播稿
2014/01/10 职场文书
公司营业员的自我评价
2014/03/04 职场文书
授权委托书范本
2014/04/03 职场文书
《月亮湾》教学反思
2014/04/14 职场文书
班长演讲稿范文
2014/04/24 职场文书
销售类求职信
2014/06/13 职场文书
班级团队活动方案
2014/08/14 职场文书
医疗专业毕业生求职信
2014/08/28 职场文书
县政府班子个人对照检查材料
2014/10/05 职场文书
团队会宣传标语
2014/10/09 职场文书
英语读书笔记
2015/07/02 职场文书
小程序wx.getUserProfile接口的具体使用
2021/06/02 Javascript