Javascript 实现匿名递归的实例代码


Posted in Javascript onMay 25, 2017

递归是一种常见的编程技巧,实名递归相信大家都不陌生,但如果想要实现匿名递归呢?比如想要返回一个匿名递归函数,又或者是定义一个匿名递归函数并直接调用它,该怎样去做呢?本文将来探讨一下它的实现。

实名递归

我们还是先从实名递归说起吧,还是用那个最简单的求阶乘的例子:

function fact(n) {
 if (n < 2) {
  return n;
 } else {
  return n * fact(n - 1);
 }
}
console.log(fact(5));

递归要求自己调用自己,如果函数有名字,这就太简单不过了。

利用变量实现递归

函数还可以赋给一个变量,不过要实现递归,函数体里面还是要依赖这个变量名:

var f = function(n) {
 if (n < 2) {
  return n;
 } else {
  return n * f(n - 1);
 }
}
console.log(f(5));

应该说这种方式跟之前的其实没有本质的不同。

匿名递归

现在我们来探讨匿名递归的实现。

初步设想

如果想要返回一个匿名递归函数,又或者是定义一个匿名递归函数并直接调用它:

(function (n) {
 if (n < 2) {
  return n;
 } else {
  return n * ?(n - 1);
 }
})(5);

如果没有一个名字,代码中那个问号我们就不知道要填写什么,就没法形成递归了,此时我们要怎么办呢?这时就要请出 arguments 对象了。

arguments 对象

在 javascript 的函数中,arguments 对象代表了实际调用时的参数对象。在我们的递归函数中,实际上我们也可以完全不用去定义“形式参数” n:

function factNoParam() {
 if (arguments[0] < 2) {
  return arguments[0];
 } else {
  return arguments[0] * factNoParam(arguments[0] - 1);
 }
}
console.log(factNoParam(5));

只要我们在调用时传入了实际的参数,就可以用 arguments[0] 取得实际传入的这个参数的值。

如果有更多的参数,还可以 arguments[1],arguments[2] 等来取得。

arguments.callee 属性

arguments 可以用来获取参数,相信你可能已经知道了,但 arguments 对象其实还有一个属性,即所谓的 callee。arguments.callee 代表了这个函数本身。这是什么意思呢?其实我们完全可以把 fact 写成这样:

function fact(n) {
 if (n < 2) {
  return n;
 } else {
  return n * arguments.callee(n - 1);
 }
}
console.log(fact(5));

那么它依然是递归的。因为 arguments.callee 实际就等于 fact。

那么,到了这里,有了这个属性的帮助,要实现匿名递归就不难了,只要把 ? 改为 arguments.callee 即可:

(function (n) {
 if (n < 2) {
  return n;
 } else {
  return n * arguments.callee(n - 1);
 }
})(5);

如果有需要,也可以把它作为匿名递归返回。

关于 javascript 实现匿名递归的介绍就到这里。希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Open and Print a Word Document
Jun 15 Javascript
JQuery操作三大控件(下拉,单选,复选)的方法
Aug 06 Javascript
jQuery获取当前对象标签名称的方法
Feb 07 Javascript
JavaScript中实现PHP的打乱数组函数shuffle实例
Oct 11 Javascript
node.js中的fs.truncateSync方法使用说明
Dec 15 Javascript
js日期范围初始化得到前一个月日期的方法
May 05 Javascript
Jquery+Ajax+PHP+MySQL实现分类列表管理(下)
Oct 28 Javascript
18个非常棒的jQuery代码片段
Nov 02 Javascript
JS实现简单短信验证码界面
Aug 07 Javascript
Vue Router的懒加载路径的解决方法
Jun 21 Javascript
浅谈Angular 观察者模式理解
Nov 01 Javascript
详解vuex的简单todolist例子
Jul 14 Javascript
Kotlin学习第一步 kotlin语法特性
May 25 #Javascript
jQuery Masonry瀑布流布局神器使用详解
May 25 #jQuery
jQuery模拟实现天猫购物车动画效果实例代码
May 25 #jQuery
jquery.masonry瀑布流效果
May 25 #jQuery
Node.js操作redis实现添加查询功能
May 25 #Javascript
浅谈struts1 &amp; jquery form 文件异步上传
May 25 #jQuery
详解Vue中过度动画效果应用
May 25 #Javascript
You might like
一个取得文件扩展名的函数
2006/10/09 PHP
php中的注释、变量、数组、常量、函数应用介绍
2012/11/16 PHP
php实现给图片加灰色半透明效果的方法
2014/10/20 PHP
php转换颜色为其反色的方法
2015/04/27 PHP
Yii框架分页技术实例分析
2019/08/30 PHP
用JavaScript获取DOM元素位置和尺寸大小的方法
2013/04/12 Javascript
jquery live()调用不存在的解决方法
2014/02/26 Javascript
Javascript中With语句用法实例
2015/05/14 Javascript
JS中常用的输出方式(五种)
2016/06/12 Javascript
jquery判断iPhone、Android设备类型
2016/09/14 Javascript
js实现消息滚动效果
2017/01/18 Javascript
WebPack配置vue多页面的技巧
2018/05/15 Javascript
Vue插件打包与发布的方法示例
2018/08/20 Javascript
使用vue-router在Vue页面之间传递数据的方法
2019/07/15 Javascript
vue-router 路由传参用法实例分析
2020/03/06 Javascript
[01:12]快闪回顾DOTA2亚洲邀请赛(DAC) 静候2018新征程开启
2018/03/11 DOTA
Python命名空间详解
2014/08/18 Python
Python中字符串的常见操作技巧总结
2016/07/28 Python
对python中执行DOS命令的3种方法总结
2018/05/12 Python
使用Anaconda3建立虚拟独立的python2.7环境方法
2018/06/11 Python
Python3安装Pillow与PIL的方法
2019/04/03 Python
Python3 使用pillow库生成随机验证码
2019/08/26 Python
PyTorch 普通卷积和空洞卷积实例
2020/01/07 Python
浅谈JupyterNotebook导出pdf解决中文的问题
2020/04/22 Python
Python判断字符串是否为空和null方法实例
2020/04/26 Python
python调用百度API实现人脸识别
2020/11/17 Python
关于探究python中sys.argv时遇到的问题详解
2021/02/23 Python
荷兰本土平价百货:HEMA
2017/10/23 全球购物
Sandro Paris美国官网:典雅别致的法国时尚服饰品牌
2017/12/26 全球购物
生产部厂长助理职位说明书
2014/03/03 职场文书
医学院毕业生自荐信范文
2014/03/06 职场文书
交通事故赔偿协议书
2014/04/15 职场文书
讲座开场白台词和结束语
2015/05/29 职场文书
HR必备:超全面的薪酬待遇管理方案!
2019/07/12 职场文书
python随机打印成绩排名表
2021/06/23 Python
详解如何使用Nginx解决跨域问题
2022/05/06 Servers