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 相关文章推荐
jquery 实现的全选和反选
Apr 15 Javascript
Extjs中TabPane如何嵌套在其他网页中实现思路及代码
Jan 27 Javascript
js跑步算法的实现代码
Dec 04 Javascript
jQuery实现列表自动滚动循环滚动展示新闻
Aug 22 Javascript
js使用cookie记录用户名的方法
Nov 26 Javascript
javascript设计模式--策略模式之输入验证
Nov 27 Javascript
微信小程序 参数传递实例代码
Mar 20 Javascript
VsCode新建VueJs项目的详细步骤
Sep 23 Javascript
bootstrap实现二级下拉菜单效果
Nov 23 Javascript
JS实现将二维数组转为json格式字符串操作示例
Jul 12 Javascript
前端面试知识点目录一览
Apr 15 Javascript
解决vue scoped html样式无效的问题
Oct 24 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
浅析php创建者模式
2014/11/25 PHP
php自定义加密与解密程序实例
2014/12/31 PHP
php从csv文件读取数据并输出到网页的方法
2015/03/14 PHP
PHP实现二维数组中的查找算法小结
2018/06/09 PHP
JQuery 构建客户/服务分离的链接模型中Table中的排序分析
2010/01/22 Javascript
javascript小数四舍五入多种方法实现
2012/12/23 Javascript
javascript静态页面传值的三种方法分享
2013/11/12 Javascript
js加载读取内容及显示与隐藏div示例
2014/02/13 Javascript
对于Form表单reset方法的新认识
2014/03/05 Javascript
fixedBox固定div漂浮代码支持ie6以上大部分主流浏览器
2014/06/26 Javascript
详解JavaScript调用栈、尾递归和手动优化
2017/06/03 Javascript
Extjs 中的 Treepanel 实现菜单级联选中效果及实例代码
2017/08/22 Javascript
Vue EventBus自定义组件事件传递
2018/06/25 Javascript
JS实现面向对象继承的5种方式分析
2018/07/21 Javascript
Vue指令指令大全
2019/02/09 Javascript
富文本编辑器vue2-editor实现全屏功能
2019/05/26 Javascript
使用ThinkJs搭建微信中控服务的实现方法
2019/08/08 Javascript
js计时事件实现圆形时钟
2020/03/25 Javascript
vue-router 控制路由权限的实现
2020/09/24 Javascript
Nest.js环境变量配置与序列化详解
2021/02/21 Javascript
python实现TCP服务器端与客户端的方法详解
2015/04/30 Python
Python中pygame的mouse鼠标事件用法实例
2015/11/11 Python
Python3实现的Mysql数据库操作封装类
2018/06/06 Python
python字典的遍历3种方法详解
2019/08/10 Python
mui几种页面跳转方式对比总结概括
2017/08/18 HTML / CSS
MyFrenchPharma中文网:最大的法国药妆平台
2016/10/07 全球购物
英国现代、当代和设计师家具店:Furntastic
2020/07/18 全球购物
面料业务员岗位职责
2013/12/26 职场文书
怎样写好创业计划书的内容
2014/02/06 职场文书
材料化学专业求职信
2014/07/15 职场文书
教师自查自纠材料
2014/10/14 职场文书
2014年反腐倡廉工作总结
2014/12/05 职场文书
社区党建工作总结2015
2015/05/13 职场文书
财务人员入职担保书
2015/09/22 职场文书
Java Socket实现Redis客户端的详细说明
2021/05/26 Redis
使用pycharm运行flask应用程序的详细教程
2021/06/07 Python