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 相关文章推荐
事件绑定之小测试  onclick &amp;&amp; addEventListener
Jul 31 Javascript
jQuery 获取URL的GET参数值的小例子
Apr 18 Javascript
JQuery+DIV自定义滚动条样式的具体实现
Jun 25 Javascript
用C/C++来实现 Node.js 的模块(二)
Sep 24 Javascript
HTML5使用DeviceOrientation实现摇一摇功能
Jun 05 Javascript
jQuery横向擦除焦点图特效代码分享
Sep 06 Javascript
javascript实现全角转半角的方法
Jan 23 Javascript
早该知道的7个JavaScript技巧
Jun 21 Javascript
iOS + node.js使用Socket.IO框架进行实时通信示例
Apr 14 Javascript
Node.js 实现简单的接口服务器的实例代码
May 23 Javascript
promise处理多个相互依赖的异步请求(实例讲解)
Aug 03 Javascript
小程序指纹验证的实现代码
Dec 04 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
模拟flock实现文件锁定
2007/02/14 PHP
php下检测字符串是否是utf8编码的代码
2008/06/28 PHP
PHP MySQL应用中使用XOR运算加密算法分享
2011/08/28 PHP
Zend Framework中的简单工厂模式 图文
2012/07/10 PHP
解析yii数据库的增删查改
2013/06/20 PHP
php获取目录所有文件并将结果保存到数组(实例)
2013/10/25 PHP
实现PHP+Mysql无限分类的方法汇总
2015/03/02 PHP
js 深拷贝函数
2008/12/04 Javascript
javascript中的对象创建 实例附注释
2011/02/08 Javascript
javascript object array方法使用详解
2012/12/03 Javascript
jQuery当鼠标悬停时放大图片的效果实例
2013/07/03 Javascript
JavaScript创建对象的写法
2013/08/29 Javascript
深入理解jquery自定义动画animate()
2016/05/24 Javascript
使用jQuery调用XML实现无刷新即时聊天
2016/08/07 Javascript
jQuery实现带遮罩层效果的blockUI弹出层示例【附demo源码下载】
2016/09/14 Javascript
详解webpack + vue + node 打造单页面(入门篇)
2017/09/23 Javascript
JS实现自定义弹窗功能
2018/08/08 Javascript
关于微信小程序获取小程序码并接受buffer流保存为图片的方法
2019/06/07 Javascript
vue实现axios图片上传功能
2019/08/20 Javascript
Vue+Element实现网页版个人简历系统(推荐)
2019/12/31 Javascript
介绍Python中内置的itertools模块
2015/04/29 Python
利用python实现命令行有道词典的方法示例
2017/01/31 Python
详解Python爬取并下载《电影天堂》3千多部电影
2019/04/26 Python
python可视化篇之流式数据监控的实现
2019/08/07 Python
python绘制趋势图的示例
2020/09/17 Python
python切片作为占位符使用实例讲解
2021/02/17 Python
HTML5 canvas基本绘图之绘制线段
2016/06/27 HTML / CSS
【魔兽争霸3重制版】原版画面与淬火MOD画面对比
2021/03/26 魔兽争霸
食堂员工工作职责
2013/12/18 职场文书
揠苗助长教学反思
2014/02/04 职场文书
党建目标管理责任书
2014/07/25 职场文书
软件研发工程师岗位职责
2014/09/30 职场文书
个人租房协议书(范本)
2014/10/14 职场文书
护士长2014年度工作总结
2014/11/11 职场文书
奖学金感谢信
2015/01/21 职场文书
如何使用PostgreSQL进行中文全文检索
2021/05/27 PostgreSQL