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 相关文章推荐
JS案例分享之金额小写转大写
May 15 Javascript
jQuery oLoader实现的加载图片和页面效果
Mar 14 Javascript
Javascript技术难点之apply,call与this之间的衔接
Dec 04 Javascript
JavaScript字符串删除重复字符的方法
Dec 25 Javascript
javascript实现移动端上的触屏拖拽功能
Mar 04 Javascript
dul无法加载bootstrap实现unload table/user恢复
Sep 29 Javascript
Vue.js中数组变动的检测详解
Oct 12 Javascript
JS中append字符串包含onclick无效传递参数失败的解决方案
Dec 26 Javascript
JS全角与半角转化实例(分享)
Jul 04 Javascript
Express + Session 实现登录验证功能
Sep 08 Javascript
Vue.js实现数据响应的方法
Aug 13 Javascript
基于Vue实现可以拖拽的树形表格实例详解
Oct 18 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
转换中文日期的PHP程序
2006/10/09 PHP
PHP+Ajax验证码验证用户登录
2016/07/20 PHP
thinkPHP中volist标签用法示例
2016/12/06 PHP
jQuery教程 $()包装函数来实现数组元素分页效果
2013/08/13 Javascript
Javascript实现返回上一页面并刷新的小例子
2013/12/11 Javascript
jQuery实现折线图的方法
2015/02/28 Javascript
jQuery实现表格行上下移动和置顶效果
2015/06/05 Javascript
JavaScript获取URL汇总
2015/06/08 Javascript
js文本框走动跑马灯效果代码分享
2015/08/25 Javascript
Javascript生成全局唯一标识符(GUID,UUID)的方法
2016/02/27 Javascript
JavaScript简单下拉菜单特效
2016/09/13 Javascript
angular 基于ng-messages的表单验证实例
2017/05/04 Javascript
关于meta viewport中target-densitydpi属性详解(推荐)
2017/08/18 Javascript
vue2.0路由切换后页面滚动位置不变BUG的解决方法
2018/03/14 Javascript
详解JavaScript添加给定的标签选项
2018/09/17 Javascript
JS实现从对象获取对象中单个键值的方法示例
2019/06/05 Javascript
layui使用数据表格实现购物车功能
2019/07/26 Javascript
JavaScript实现H5接金币功能(实例代码)
2021/02/22 Javascript
python实现简单的TCP代理服务器
2014/10/08 Python
Python isinstance函数介绍
2015/04/14 Python
PyQt5每天必学之日历控件QCalendarWidget
2018/04/19 Python
对python以16进制打印字节数组的方法详解
2019/01/24 Python
从0开始的Python学习014面向对象编程(推荐)
2019/04/02 Python
使用TensorFlow实现简单线性回归模型
2019/07/19 Python
python时间与Unix时间戳相互转换方法详解
2020/02/13 Python
Python如何爬取b站热门视频并导入Excel
2020/08/10 Python
葡萄牙航空官方网站:TAP Air Portugal
2019/10/31 全球购物
优秀广告词大全
2014/03/19 职场文书
公司任命书范本
2014/06/04 职场文书
四风问题个人自查剖析材料思想汇报
2014/09/21 职场文书
2014大学生党员评议个人总结
2014/09/22 职场文书
教师党员学习群众路线心得体会
2014/11/04 职场文书
医德医风个人总结
2015/02/28 职场文书
《雷雨》教学反思
2016/02/20 职场文书
MySQL的存储过程和相关函数
2022/04/26 MySQL
在windows server 2012 r2中安装mysql的详细步骤
2022/07/23 Servers