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 相关文章推荐
在Firefox下js select标签点击无法弹出
Mar 06 Javascript
jquery获取颜色在ie和ff下的区别示例介绍
Mar 28 Javascript
基于jquery和svg实现超炫酷的动画特效
Dec 09 Javascript
javascript中Array数组的迭代方法实例分析
Feb 04 Javascript
在线所见即所得HTML编辑器的实现原理浅析
Apr 25 Javascript
Javascript实现字数统计
Jul 03 Javascript
jQuery插件artDialog.js使用与关闭方法示例
Oct 09 jQuery
vuejs 制作背景淡入淡出切换动画的实例
Sep 01 Javascript
Jquery和CSS实现选择框重置按钮功能
Nov 08 jQuery
JS实现的贪吃蛇游戏完整实例
Jan 18 Javascript
Laravel admin实现消息提醒、播放音频功能
Jul 10 Javascript
ant-design-vue按需加载的坑的解决
May 14 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
总集篇&特番节目先行播出!《SAO Alicization War of Underworld》第2季度TV动画4月25日放送!
2020/03/06 日漫
用函数读出数据表内容放入二维数组
2006/10/09 PHP
php设计模式 Builder(建造者模式)
2011/06/26 PHP
PHP对象递归引用造成内存泄漏分析
2014/08/28 PHP
php微信公众平台开发(三)订阅事件处理
2016/12/06 PHP
定位地理位置PHP判断员工打卡签到经纬度是否在打卡之内
2019/05/23 PHP
Gird组件 Part-3:范例RSSFeed Viewer
2007/03/10 Javascript
(function($){...})(jQuery)的意思
2010/07/22 Javascript
利用js判断浏览器类型(是否为IE,Firefox,Opera浏览器)
2013/11/22 Javascript
JavaScript获取Url里的参数
2014/12/18 Javascript
JQuery中模拟image的ajaxPrefilter与ajaxTransport处理
2015/06/19 Javascript
基于javascript实现图片切换效果
2016/04/17 Javascript
jQuery页面元素动态添加后绑定事件丢失方法,非 live
2016/06/16 Javascript
JavaScript实现类似拉勾网的鼠标移入移出效果
2016/10/27 Javascript
浅谈jQuery的bind和unbind事件(绑定和解绑事件)
2017/03/02 Javascript
JavaScript实现简单图片轮播效果
2017/08/21 Javascript
js 两数组去除重复数值的实例
2017/12/06 Javascript
Vue实现点击后文字变色切换方法
2018/02/11 Javascript
javascript实现支付宝滑块验证码效果
2020/07/24 Javascript
[02:15]2014DOTA2国际邀请赛 赛后退役选手回顾
2014/08/01 DOTA
Python中使用wxPython开发的一个简易笔记本程序实例
2015/02/08 Python
详解Python中的多线程编程
2015/04/09 Python
Python编程深度学习绘图库之matplotlib
2018/12/28 Python
Python中if有多个条件处理方法
2020/02/26 Python
python3格式化字符串 f-string的高级用法(推荐)
2020/03/04 Python
解决redis与Python交互取出来的是bytes类型的问题
2020/07/16 Python
Django自带用户认证系统使用方法解析
2020/11/12 Python
简单介绍CSS3中Media Query的使用
2015/07/07 HTML / CSS
英国领先的维生素和补充剂品牌:Higher Nature
2019/08/26 全球购物
俄罗斯三星品牌商店:Samsungstore
2020/04/05 全球购物
四年的个人工作自我评价
2013/12/10 职场文书
银行招聘自荐信
2015/03/06 职场文书
毕业实习证明范本
2015/06/16 职场文书
2015年国庆节标语大全
2015/07/30 职场文书
幼儿园迎新生欢迎词
2015/09/30 职场文书
MySQL外键约束(Foreign Key)案例详解
2022/06/28 MySQL