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 实现??打印?理
Apr 28 Javascript
document.getElementById为空或不是对象的解决方法
Jan 24 Javascript
用jQuery模拟页面加载进度条的实现代码
Dec 19 Javascript
display和visibility的区别示例介绍
Feb 26 Javascript
jQuery实现用户信息表格的添加和删除功能
Sep 12 jQuery
详解在Vue中有条件地使用CSS类
Sep 30 Javascript
vue利用better-scroll实现轮播图与页面滚动详解
Oct 20 Javascript
在Mac下彻底卸载node和npm的方法
May 16 Javascript
Vue源码中要const _toStr = Object.prototype.toString的原因分析
Dec 09 Javascript
手把手带你封装一个vue component第三方库
Feb 14 Javascript
小程序调用微信支付的方法
Sep 26 Javascript
在vue项目实现一个ctrl+f的搜索功能
Feb 28 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
东芝TOSHIBA RP-F11电路分析
2021/03/02 无线电
php中修改浏览器的User-Agent来伪装你的浏览器和操作系统
2011/07/29 PHP
封装ThinkPHP的一个文件上传方法实例
2014/10/31 PHP
PHP读取CURL模拟登录时生成Cookie文件的方法
2014/11/04 PHP
jquery radio 操作代码
2011/03/16 Javascript
javascript算法题 求任意一个1-9位不重复的N位数在该组合中的大小排列序号
2012/07/21 Javascript
关于JavaScript中的关联数组分析
2013/04/09 Javascript
jquery获取css中的选择器(实例讲解)
2013/12/02 Javascript
jQuery中outerHeight()方法用法实例
2015/01/19 Javascript
JS实现表格数据各种搜索功能的方法
2015/03/03 Javascript
javascript解析xml实现省市县三级联动的方法
2015/07/25 Javascript
javascript控制图片播放的实现代码
2020/07/29 Javascript
jQuery实现自动与手动切换的滚动新闻特效代码分享
2015/08/27 Javascript
基于JavaScript实现智能右键菜单
2016/03/02 Javascript
JS中cookie的使用及缺点讲解
2017/05/13 Javascript
Extjs 中的 Treepanel 实现菜单级联选中效果及实例代码
2017/08/22 Javascript
原生JS实现逼真的图片3D旋转效果详解
2019/02/16 Javascript
利用百度echarts实现图表功能简单入门示例【附源码下载】
2019/06/10 Javascript
vue中axios的二次封装实例讲解
2019/10/14 Javascript
详解Vue的异步更新实现原理
2020/12/22 Vue.js
python 调用c语言函数的方法
2017/09/29 Python
python实现读取excel写入mysql的小工具详解
2017/11/20 Python
Python操作mongodb数据库进行模糊查询操作示例
2018/06/09 Python
Python实现处理逆波兰表达式示例
2018/07/30 Python
python中的反斜杠问题深入讲解
2019/08/12 Python
python聚类算法解决方案(rest接口/mpp数据库/json数据/下载图片及数据)
2019/08/28 Python
使用django和vue进行数据交互的方法步骤
2019/11/11 Python
Python3.7实现验证码登录方式代码实例
2020/02/14 Python
详解python中groupby函数通俗易懂
2020/05/14 Python
Python实现播放和录制声音的功能
2020/08/12 Python
Python eval函数介绍及用法
2020/11/09 Python
html5新增的属性和废除的属性简要概述
2013/02/20 HTML / CSS
电子技术专业中专生的自我评价
2013/12/17 职场文书
2014年小学语文工作总结
2014/12/20 职场文书
小学生成绩单评语
2014/12/31 职场文书
2015年计划生育责任书
2015/05/08 职场文书