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 相关文章推荐
关于Javascript与iframe的那些事儿
Jul 04 Javascript
jquery放大镜效果超漂亮噢
Nov 15 Javascript
深入理解jQuery中live与bind方法的区别
Dec 18 Javascript
jquery滚动到顶部底部代码
Apr 20 Javascript
javascript中的五种基本数据类型
Aug 26 Javascript
jQuery解析json格式数据简单实例
Jan 22 Javascript
微信小程序开发之toast提示插件使用示例
Jun 08 Javascript
AngularJS中controller控制器继承的使用方法
Nov 03 Javascript
基于vue和websocket的多人在线聊天室
Feb 01 Javascript
vue-iview动态新增和删除的方法
Jun 17 Javascript
vue data对象重新赋值无效(未更改)的解决方式
Jul 24 Javascript
浅谈JavaScript节流和防抖函数
Aug 25 Javascript
详解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
DC最新动画电影:《战争之子》为何内容偏激,毁了一个不错的漫画
2020/04/09 欧美动漫
php源码分析之DZX1.5字符串截断函数cutstr用法
2015/06/17 PHP
动态表单验证的操作方法和TP框架里面的ajax表单验证
2017/07/19 PHP
php+croppic.js实现剪切上传图片功能
2018/08/14 PHP
apache集成php7.3.5的详细步骤
2019/06/20 PHP
JQery jstree 大数据量问题解决方法
2010/03/09 Javascript
Jquery调用webService远程访问出错的解决方法
2010/05/21 Javascript
在vs2010中调试javascript代码方法
2011/02/11 Javascript
Jquery中国地图热点效果-鼠标经过弹出提示层信息的简单实例
2014/02/12 Javascript
jQuery+PHP星级评分实现方法
2015/10/02 Javascript
快速学习jQuery插件 Form表单插件使用方法
2015/12/01 Javascript
JS中script标签defer和async属性的区别详解
2016/08/12 Javascript
解决bootstrap中使用modal加载kindeditor时弹出层文本框不能输入的问题
2017/06/05 Javascript
jquery 动态遍历select 赋值的实例
2018/09/12 jQuery
浅谈Angular单元测试总结
2019/03/22 Javascript
[02:16]卖萌的僵尸 DOTA2神话信使飞僵小宝来袭
2014/03/24 DOTA
[59:44]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 paiN vs iG
2018/03/31 DOTA
[01:00:25]NB vs Secret 2018国际邀请赛小组赛BO1 B组加赛 8.19
2018/08/21 DOTA
Python面向对象编程中关于类和方法的学习笔记
2016/06/30 Python
简单掌握Python的Collections模块中counter结构的用法
2016/07/07 Python
Python实现的堆排序算法原理与用法实例分析
2017/11/22 Python
终端命令查看TensorFlow版本号及路径的方法
2018/06/13 Python
selenium获取当前页面的url、源码、title的方法
2019/06/12 Python
Python restful框架接口开发实现
2020/04/13 Python
简单的命令查看安装的python版本号
2020/08/28 Python
python如何实现DES加密
2020/09/21 Python
Python通过队列来实现进程间通信的示例
2020/10/14 Python
Boda Skins皮衣官网:奢侈皮夹克,全球配送
2016/12/15 全球购物
什么是Assembly(程序集)
2014/09/14 面试题
商场中秋节活动方案
2014/02/07 职场文书
大学生两会学习心得体会
2014/03/10 职场文书
共产党员公开承诺书
2014/03/25 职场文书
大学学生会竞选演讲稿
2014/04/25 职场文书
办公用品管理制度
2015/08/04 职场文书
2016医师资格考试考生诚信考试承诺书
2016/03/25 职场文书
apache基于端口创建虚拟主机的示例
2021/04/24 Servers