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常用方法、属性集合及NodeList 和 HTMLCollection 的浏览器差异
Dec 25 Javascript
jQuery表单获取和失去焦点输入框提示效果的实例代码
Aug 01 Javascript
Jquery使用Firefox FireBug插件调试Ajax步骤讲解
Dec 02 Javascript
深入理解JavaScript系列(49):Function模式(上篇)
Mar 04 Javascript
$.extend 的一个小问题
Jun 18 Javascript
jQuery插件ImageDrawer.js实现动态绘制图片动画(附源码下载)
Feb 25 Javascript
thinkjs之页面跳转同步异步操作
Feb 05 Javascript
VUE利用vuex模拟实现新闻点赞功能实例
Jun 28 Javascript
extjs简介_动力节点Java学院整理
Jul 17 Javascript
vue 中引用gojs绘制E-R图的方法示例
Aug 24 Javascript
Node.js+ELK日志规范的实现
May 23 Javascript
layui实现三级导航菜单
Jul 26 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代码把全角数字转为半角数字
2007/12/10 PHP
PHP 网页过期时间的控制代码
2009/06/29 PHP
YII Framework框架教程之国际化实现方法
2016/03/14 PHP
php反序列化长度变化尾部字符串逃逸(0CTF-2016-piapiapia)
2020/02/15 PHP
jQuery的强大选择器小结
2009/12/27 Javascript
jQuery 源码分析笔记(7) Queue
2011/06/19 Javascript
JQuery循环滚动图片代码
2011/12/08 Javascript
JavaScript创建类/对象的几种方式概述及实例
2013/05/06 Javascript
javascript 数组操作详解
2015/01/29 Javascript
jquery分割字符串的方法
2015/06/24 Javascript
JavaScript数组各种常见用法实例分析
2015/08/04 Javascript
jQuery实现简单的图片查看器
2020/09/11 Javascript
使用html+js+css 实现页面轮播图效果(实例讲解)
2017/09/21 Javascript
JavaScript实现鼠标滚轮控制页面图片切换功能示例
2017/10/14 Javascript
JS/jQuery实现简单的开关灯效果【案例】
2019/02/19 jQuery
layui 对弹窗 form表单赋值的实现方法
2019/09/04 Javascript
Vue中使用Lodop插件实现打印功能的简单方法
2019/12/19 Javascript
vue实现移动端返回顶部
2020/10/12 Javascript
antd Form组件方法getFieldsValue获取自定义组件的值操作
2020/10/29 Javascript
[04:09]显微镜下的DOTA2第十二期—NaVi美如画的团战
2014/06/23 DOTA
python并发编程之多进程、多线程、异步和协程详解
2016/10/28 Python
python爬虫之百度API调用方法
2017/06/11 Python
Python实现判断一个字符串是否包含子串的方法总结
2017/11/21 Python
PyTorch快速搭建神经网络及其保存提取方法详解
2018/04/28 Python
python 除法保留两位小数点的方法
2018/07/16 Python
python读取图片并修改格式与大小的方法
2018/07/24 Python
python画图——实现在图上标注上具体数值的方法
2019/07/08 Python
Python 余弦相似度与皮尔逊相关系数 计算实例
2019/12/23 Python
django Model层常用验证器及自定义验证器详解
2020/07/15 Python
python 使用paramiko模块进行封装,远程操作linux主机的示例代码
2020/12/03 Python
人事行政主管岗位职责
2013/12/22 职场文书
2016年4月份红领巾广播稿
2015/12/21 职场文书
工作违纪的检讨书范文
2019/07/09 职场文书
2019年七夕情人节浪漫祝福语大全!
2019/08/08 职场文书
60条职场经典语录,总有一条能触动你的心
2019/08/21 职场文书
Python使用pyecharts控件绘制图表
2022/06/05 Python