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 相关文章推荐
解决jquery的.animate()函数在IE6下的问题
Dec 03 Javascript
使用js获取地址栏中传递的值
Jul 02 Javascript
JS定时器实例详细分析
Oct 11 Javascript
Jquery Mobile 自定义按钮图标
Nov 18 Javascript
BootStrapValidator校验方式
Dec 19 Javascript
bootstrap滚动监控器使用方法解析
Jan 13 Javascript
[js高手之路]从原型链开始图解继承到组合继承的产生详解
Aug 28 Javascript
使用JavaScript实现点击循环切换图片效果
Sep 03 Javascript
微信小程序用户自定义模版用法实例分析
Nov 28 Javascript
详解封装基础的angular4的request请求方法
Jun 05 Javascript
详解Vue.js使用Swiper.js在iOS
Sep 10 Javascript
使用pkg打包Node.js应用的方法步骤
Oct 19 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 第三节 变量介绍
2012/04/28 PHP
在win系统安装配置 Memcached for PHP 5.3 图文教程
2015/03/03 PHP
Yii2分页的使用及其扩展方法详解
2016/05/23 PHP
php结合redis高并发下发帖、发微博的实现方法
2016/12/15 PHP
浅谈javascript的数据类型检测
2010/07/10 Javascript
jQuery插件 selectToSelect使用方法
2013/10/02 Javascript
javascript函数作用域学习示例(js作用域)
2014/01/13 Javascript
js实现透明度渐变效果的方法
2015/04/10 Javascript
浅谈javascript实现八大排序
2015/04/27 Javascript
JavaScript计算某一天是星期几的方法
2015/08/05 Javascript
jquery Deferred 快速解决异步回调的问题
2016/04/05 Javascript
jQuery遍历json的方法分析
2016/04/16 Javascript
CSS3+JavaScript实现翻页幻灯片效果
2017/06/28 Javascript
js实现Tab选项卡切换效果
2020/07/17 Javascript
vue+socket.io+express+mongodb 实现简易多房间在线群聊示例
2017/10/21 Javascript
面包屑导航详解
2017/12/07 Javascript
js实现关闭网页出现是否离开提示
2017/12/07 Javascript
jQuery实现判断上传图片类型和大小的方法示例
2018/04/11 jQuery
原生JS实现图片懒加载之页面性能优化
2019/04/26 Javascript
es6中class类静态方法,静态属性,实例属性,实例方法的理解与应用分析
2020/02/15 Javascript
vue实现点击按钮切换背景颜色的示例代码
2020/06/23 Javascript
PyQt5每天必学之工具提示功能
2018/04/19 Python
numpy实现合并多维矩阵、list的扩展方法
2018/05/08 Python
对pandas写入读取h5文件的方法详解
2018/12/28 Python
Python 的字典(Dict)是如何存储的
2019/07/05 Python
python的pstuil模块使用方法总结
2019/07/26 Python
对YOLOv3模型调用时候的python接口详解
2019/08/26 Python
css3动画过渡实现鼠标跟随导航效果
2018/02/08 HTML / CSS
加拿大知名的国际儿童品牌:Hatley
2016/11/09 全球购物
Jdbc数据访问技术面试题
2012/03/30 面试题
优秀护士演讲稿
2014/04/30 职场文书
2015年学校管理工作总结
2015/07/20 职场文书
500字作文之关于爸爸
2019/11/14 职场文书
JUnit5常用注解的使用
2021/07/02 Java/Android
详解python的异常捕获
2022/03/03 Python
Win11 Build 25179预览版发布(附更新内容+ISO官方镜像下载)
2022/08/14 数码科技