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 相关文章推荐
图片连续滚动代码[兼容IE/firefox]
Jun 11 Javascript
javascript 写类方式之五
Jul 05 Javascript
在父页面调用子页面的JS方法
Sep 29 Javascript
JS控制一个DIV层在指定时间内消失的方法
Feb 17 Javascript
深入解析JavaScript中函数的Currying柯里化
Mar 19 Javascript
JavaScript从0开始构思表情插件
Jul 26 Javascript
详解javascript设计模式三:代理模式
Mar 25 Javascript
vue中使用element ui的弹窗与echarts之间的问题详解
Oct 25 Javascript
vue动态路由:路由参数改变,视图不更新问题的解决
Nov 05 Javascript
Vue使用虚拟dom进行渲染view的方法
Dec 26 Javascript
如何通过javaScript去除字符串两端的空白字符
Feb 06 Javascript
如何手动实现一个 JavaScript 模块执行器
Oct 16 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连接MYSQL成功与否的代码
2013/08/16 PHP
php使用环形链表解决约瑟夫问题完整示例
2018/08/07 PHP
php+mysql开发中的经验与常识小结
2019/03/25 PHP
Javascript 同时提交多个Web表单的方法
2009/02/19 Javascript
Jquery拖拽并简单保存的实现代码
2010/11/28 Javascript
jquery遍历数组与筛选数组的方法
2013/11/05 Javascript
javascript实现避免页面按钮重复提交
2015/01/08 Javascript
javascript中createElement的两种创建方式
2015/05/14 Javascript
JS模拟实现方法重载示例
2016/08/03 Javascript
JavaScript中的对象和原型(一)
2016/08/12 Javascript
JS实现图片延迟加载并淡入淡出效果的简单方法
2016/08/25 Javascript
Jquery遍历select option和添加移除option的实现方法
2016/08/26 Javascript
详谈jQuery unbind 删除绑定事件 / 移除标签方法
2017/03/02 Javascript
详解angularJs指令的3种绑定策略
2017/04/13 Javascript
JS switch判断 三目运算 while 及 属性操作代码
2017/09/03 Javascript
webpack 模块热替换原理
2018/04/09 Javascript
Layui数据表格之获取表格中所有的数据方法
2018/08/20 Javascript
JS使用Date对象实时显示当前系统时间简单示例
2018/08/23 Javascript
vue-router 前端路由之路由传值的方式详解
2019/04/30 Javascript
vue.js+elementUI实现点击左右箭头切换头像功能(类似轮播图效果)
2019/09/05 Javascript
原生JS实现汇率转换功能代码实例
2020/05/13 Javascript
Vue2.0 ES6语法降级ES5的操作
2020/10/30 Javascript
python实现可将字符转换成大写的tcp服务器实例
2015/04/29 Python
详解在Python程序中使用Cookie的教程
2015/04/30 Python
实例讲解Python编程中@property装饰器的用法
2016/06/20 Python
Python实现的计算马氏距离算法示例
2018/04/03 Python
Selenium 滚动页面至元素可见的方法
2020/03/18 Python
解决html5中video标签无法播放mp4问题的办法
2017/05/07 HTML / CSS
印度尼西亚值得信赖的第一家网店:Bhinneka
2018/07/16 全球购物
Charles & Keith欧盟:新加坡时尚品牌
2019/08/01 全球购物
会计演讲稿范文
2014/05/23 职场文书
建筑施工安全责任书
2014/07/24 职场文书
2015年医务科工作总结范文
2015/05/26 职场文书
2015年清剿火患专项行动工作总结
2015/07/27 职场文书
2015年国庆节演讲稿范文
2015/07/30 职场文书
辞职报告(范文三篇)
2019/08/27 职场文书