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比较文档位置
Apr 08 Javascript
JS实现倒计时和文字滚动的效果实例
Oct 29 Javascript
javascript定义变量时带var与不带var的区别分析
Jan 12 Javascript
javascript实现youku的视频代码自适应宽度
May 25 Javascript
在JavaScript中处理字符串之fontcolor()方法的使用
Jun 08 Javascript
JavaScript正则表达式之multiline属性的应用
Jun 16 Javascript
jQuery实现为图片添加镜头放大效果的方法
Jun 25 Javascript
关于javascript中dataset的问题小结
Nov 16 Javascript
深入理解JavaScript程序中内存泄漏
Mar 17 Javascript
jQuery实现级联下拉框实战(5)
Feb 08 Javascript
jquery+ajax实现省市区三级联动 (封装和不封装两种方式)
May 15 jQuery
JS设置自定义快捷键并实现图片上下左右移动
Oct 17 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和ACCESS写聊天室(五)
2006/10/09 PHP
关于php mvc开发模式的感想
2011/06/28 PHP
PHP关联数组实现根据元素值删除元素的方法
2015/06/26 PHP
分享20多个很棒的jQuery 文件上传插件或教程
2011/09/04 Javascript
js将iframe中控件的值传到主页面控件中的实现方法
2013/03/11 Javascript
给事件响应函数传参数的四种方式小结
2013/12/05 Javascript
javascript进行数组追加方法小结
2014/06/16 Javascript
利用JS实现数字增长
2016/07/28 Javascript
js仿微信语音播放实现思路
2016/12/12 Javascript
Angular的模块化(代码分享)
2016/12/26 Javascript
js实现二级导航功能
2017/03/03 Javascript
浅谈关于axios和session的一些事
2017/07/13 Javascript
vue+iview 实现可编辑表格的示例代码
2018/10/31 Javascript
在layui中对table中的数据进行判断(0、1)转换为提示信息的方法
2019/09/28 Javascript
在Vue项目中,防止页面被缩放和放大示例
2019/10/28 Javascript
JavaScript实现英语单词题库
2019/12/24 Javascript
javascript canvas时钟模拟器
2020/07/13 Javascript
[01:17]Ti4 循环赛第一日回顾
2014/07/11 DOTA
python中实现php的var_dump函数功能
2015/01/21 Python
windows下ipython的安装与使用详解
2016/10/20 Python
用Python一键搭建Http服务器的方法
2018/06/01 Python
用Python和WordCloud绘制词云的实现方法(内附让字体清晰的秘笈)
2019/01/08 Python
django框架中间件原理与用法详解
2019/12/10 Python
使用tensorflow DataSet实现高效加载变长文本输入
2020/01/20 Python
python爬虫开发之Beautiful Soup模块从安装到详细使用方法与实例
2020/03/09 Python
10个python3常用排序算法详细说明与实例(快速排序,冒泡排序,桶排序,基数排序,堆排序,希尔排序,归并排序,计数排序)
2020/03/17 Python
pip安装提示Twisted错误问题(Python3.6.4安装Twisted错误)
2020/05/09 Python
python如何提升爬虫效率
2020/09/27 Python
matplotlib之pyplot模块之标题(title()和suptitle())
2021/02/22 Python
使用css3做0.5px的细线的示例代码
2018/01/18 HTML / CSS
LODI女鞋在线商店:阿利坎特的鞋类品牌
2019/02/15 全球购物
美国办公用品折扣网站:Shoplet.com
2019/11/24 全球购物
四年的个人工作自我评价
2013/12/10 职场文书
美容院营销方案
2014/03/05 职场文书
Python学习之迭代器详解
2022/04/01 Python
解决Mysql中的innoDB幻读问题
2022/04/29 MySQL