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的模拟苹果桌面Dock效果(稳定版)
Oct 15 Javascript
.net,js捕捉文本框回车键事件的小例子(兼容多浏览器)
Mar 11 Javascript
使用PHP+JQuery+Ajax分页的实现
Apr 23 Javascript
node.js中的path.normalize方法使用说明
Dec 08 Javascript
JavaScript针对网页节点的增删改查用法实例
Feb 02 Javascript
AJAX实现瀑布流触发分页与分页触发瀑布流的方法
May 23 Javascript
vue.js中Vue-router 2.0基础实践教程
May 08 Javascript
vuejs 切换导航条高亮(路由菜单高亮)的方法示例
May 29 Javascript
对node通过fs模块判断文件是否是文件夹的实例讲解
Jun 10 Javascript
解决小程序无法触发SESSION问题
Feb 03 Javascript
Element实现表格嵌套、多个表格共用一个表头的方法
May 09 Javascript
通过高德地图API获得某条道路上的所有坐标用于描绘道路的方法
Aug 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的FTP学习(三)
2006/10/09 PHP
利用PHP动态生成VRML网页
2006/10/09 PHP
PHP图像处理之使用imagecolorallocate()函数设置颜色例子
2014/11/19 PHP
Laravel5.1自定义500错误页面示例
2016/10/09 PHP
laravel通用化的CURD的实现
2019/12/13 PHP
10个基于Jquery的幻灯片插件教程
2010/10/29 Javascript
Array.prototype.concat不是通用方法反驳[译]
2012/09/20 Javascript
jQuery中 noConflict() 方法使用
2013/04/25 Javascript
JavaScript中的数组特性介绍
2014/12/30 Javascript
Javascript编程中几种继承方式比较分析
2015/11/28 Javascript
jquery实用技巧之输入框提示语句
2016/07/28 Javascript
Angular在一个页面中使用两个ng-app的方法
2017/02/20 Javascript
jQuery插件zTree实现更新根节点中第i个节点名称的方法示例
2017/03/08 Javascript
javaScript实现复选框全选反选事件详解
2020/11/20 Javascript
webpack 4.0.0-beta.0版本新特性介绍
2018/02/10 Javascript
JavaScript中的E-mail 地址格式验证
2018/03/28 Javascript
Node.js中的cluster模块深入解读
2018/06/11 Javascript
layui中使用jquery控制radio选中事件的示例代码
2018/08/15 jQuery
基于Three.js实现360度全景图片
2018/12/30 Javascript
ES6 迭代器与可迭代对象的实现
2019/02/11 Javascript
vue组件命名和props命名代码详解
2019/09/01 Javascript
JS如何实现封装列表右滑动删除收藏按钮
2020/07/23 Javascript
python脚本实现xls(xlsx)转成csv
2016/04/10 Python
浅谈pandas中DataFrame关于显示值省略的解决方法
2018/04/08 Python
Python中Proxypool库的安装与配置
2018/10/19 Python
Django Admin设置应用程序及模型顺序方法详解
2020/04/01 Python
CSS3 media queries + jQuery实现响应式导航
2016/09/30 HTML / CSS
使用CSS3和Checkbox实现JQuery的一些效果
2015/08/03 HTML / CSS
小学教育毕业生自荐信
2013/11/18 职场文书
干部培训自我鉴定
2014/01/22 职场文书
初中三年毕业生的自我评价分享
2014/02/14 职场文书
酒店员工检讨书
2014/02/18 职场文书
不尊敬老师的检讨书
2014/12/21 职场文书
公司总经理岗位职责
2015/04/01 职场文书
pytest进阶教程之fixture函数详解
2021/03/29 Python
Java如何实现树的同构?
2021/06/22 Java/Android