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实例教程(19) 使用HoTMetal(4)
Dec 23 Javascript
新手入门常用代码集锦
Jan 11 Javascript
一个简单的网站访问JS计数器 刷新1次加1次访问
Sep 20 Javascript
Extjs4 Treegrid 使用心得分享(经验篇)
Jul 01 Javascript
微信公众号 摇一摇周边功能开发
Dec 08 Javascript
原生js验证简洁注册登录页面
Dec 17 Javascript
React-intl 实现多语言的示例代码
Nov 03 Javascript
js事件on动态绑定数据,绑定多个事件的方法
Sep 15 Javascript
JS使用cookie保存用户登录信息操作示例
May 30 Javascript
element-ui中按需引入的实现
Dec 25 Javascript
JS数组方法slice()用法实例分析
Jan 18 Javascript
vue 需求 data中的数据之间的调用操作
Aug 05 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变量引用的面试题
2010/08/08 PHP
利用谷歌 Translate API制作自己的翻译脚本
2014/06/04 PHP
CI(CodeIgniter)模型用法实例分析
2016/01/20 PHP
非常有用的9个PHP代码片段
2016/04/06 PHP
JS中使用sort结合localeCompare实现中文排序实例
2014/07/23 Javascript
JavaScript插件化开发教程(六)
2015/02/01 Javascript
jQuery团购倒计时特效实现方法
2015/05/07 Javascript
Web前端开发工具——bower依赖包管理工具
2016/03/29 Javascript
JavaScript中定时控制Throttle、Debounce和Immediate详解
2016/11/17 Javascript
浅谈vue2 单页面如何设置网页title
2017/11/08 Javascript
Vue源码中要const _toStr = Object.prototype.toString的原因分析
2018/12/09 Javascript
vue-router传参用法详解
2019/01/19 Javascript
React中使用UMEditor的方法示例
2019/12/27 Javascript
javascript实现倒计时提示框
2021/03/02 Javascript
vue+flask实现视频合成功能(拖拽上传)
2021/03/04 Vue.js
python自动化测试实例解析
2014/09/28 Python
Python找出9个连续的空闲端口
2016/02/01 Python
Python学习笔记之图片人脸检测识别实例教程
2019/03/06 Python
Python BeautifulSoup [解决方法] TypeError: list indices must be integers or slices, not str
2019/08/07 Python
python实现邮件发送功能
2019/08/10 Python
使用Python进行中文繁简转换的实现代码
2019/10/18 Python
python编程进阶之类和对象用法实例分析
2020/02/21 Python
Python Mock模块原理及使用方法详解
2020/07/07 Python
在django中查询获取数据,get, filter,all(),values()操作
2020/08/09 Python
HTML5实践-图片设置成灰度图
2012/11/12 HTML / CSS
HTML5 Canvas 实现圆形进度条并显示数字百分比效果示例
2017/08/18 HTML / CSS
施华洛世奇日本官网:SWAROVSKI日本
2018/05/04 全球购物
如何写一个Java类既可以用作applet也可以用作java应用
2016/01/18 面试题
街道党工委党的群众路线教育实践活动对照检查材料思想汇报
2014/10/05 职场文书
小学教师党员承诺书
2015/04/27 职场文书
董事长新年致辞
2015/07/29 职场文书
小学中队长竞选稿
2015/11/20 职场文书
详解Nginx启动失败的几种错误处理
2021/04/01 Servers
浅谈Redis在直播场景的实践方案
2021/04/27 Redis
maven 解包依赖项中的文件的解决方法
2022/07/15 Java/Android