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 相关文章推荐
使用javascript:将其它类型值转换成布尔类型值的解决方法详解
May 07 Javascript
ExtJS自定义主题(theme)样式详解
Nov 18 Javascript
原生js和jquery中有关透明度设置的相关问题
Jan 08 Javascript
JS 获取浏览器和屏幕宽高等信息代码
Mar 31 Javascript
js实现图片旋转的三种方法
Apr 10 Javascript
在css加载完毕后自动判断页面是否加入css或js文件
Sep 10 Javascript
javascript实现框架高度随内容改变的方法
Jul 23 Javascript
详解AngularJS中module模块的导入导出
Dec 10 Javascript
JS阻止事件冒泡的方法详解
Aug 26 Javascript
通过实例了解JS 连续赋值
Sep 24 Javascript
JS回调函数深入理解
Oct 16 Javascript
JavaScript设计模式--简单工厂模式定义与应用案例详解
May 23 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 获取本地IP代码
2013/06/23 PHP
分别用marquee和div+js实现首尾相连循环滚动效果,仅3行代码
2011/09/21 Javascript
js改变img标签的src属性在IE下没反应的解决方法
2013/07/23 Javascript
Jquery实现的一种常用高亮效果示例代码
2014/01/28 Javascript
JavaScript禁止复制与粘贴的实现代码
2016/05/16 Javascript
Knockoutjs 学习系列(二)花式捆绑
2016/06/07 Javascript
Javascript+CSS3实现进度条效果
2016/10/28 Javascript
jquery实现input框获取焦点的简单实例
2017/01/26 Javascript
laydate日历控件使用方法详解
2017/11/20 Javascript
[02:16]2018年度CS GO最具人气选手-完美盛典
2018/12/16 DOTA
[40:19]完美世界DOTA2联赛PWL S3 Rebirth vs CPG 第二场 12.18
2020/12/19 DOTA
Python写的贪吃蛇游戏例子
2014/06/16 Python
Python使用迭代器捕获Generator返回值的方法
2017/04/05 Python
Python编程实现双击更新所有已安装python模块的方法
2017/06/05 Python
Python爬虫中urllib库的进阶学习
2018/01/05 Python
pandas groupby 分组取每组的前几行记录方法
2018/04/20 Python
对python中xlsx,csv以及json文件的相互转化方法详解
2018/12/25 Python
Windows系统Python直接调用C++ DLL的方法
2019/08/01 Python
python爬虫库scrapy简单使用实例详解
2020/02/10 Python
python3.6.8 + pycharm + PyQt5 环境搭建的图文教程
2020/06/11 Python
新手常见Python错误及异常解决处理方案
2020/06/18 Python
OpenCV实现机器人对物体进行移动跟随的方法实例
2020/11/09 Python
Topshop法国官网:英国快速时尚品牌
2018/04/08 全球购物
安德玛菲律宾官网:Under Armour菲律宾
2020/07/28 全球购物
Static Nested Class 和 Inner Class的不同
2013/11/28 面试题
校园餐饮创业计划书
2014/01/10 职场文书
事业单位公务员的职业生涯规划
2014/01/15 职场文书
医学专业应届生的自我评价
2014/02/28 职场文书
幼儿园教师演讲稿
2014/05/06 职场文书
职工小家建设活动方案
2014/08/25 职场文书
2015年大学班主任工作总结
2015/04/30 职场文书
吴仁宝观后感
2015/06/09 职场文书
教师节主题班会方案
2015/08/17 职场文书
golang实现一个简单的websocket聊天室功能
2021/10/05 Golang
Mysql Innodb存储引擎之索引与算法
2022/02/15 MySQL
详细聊一聊mysql的树形结构存储以及查询
2022/04/05 MySQL