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 相关文章推荐
js jquery做的图片连续滚动代码
Jan 06 Javascript
js 数组克隆方法 小结
Mar 20 Javascript
从jQuery.camelCase()学习string.replace() 函数学习
Sep 13 Javascript
js获得鼠标的坐标值的方法
Mar 13 Javascript
jQuery获取复选框被选中数量及判断选择值的方法详解
May 25 Javascript
JS实现隔行换色的表格排序
Mar 27 Javascript
bootstrap手风琴折叠示例代码分享
May 22 Javascript
Angular.JS中select下拉框设置value的方法
Jun 20 Javascript
详解React 服务端渲染方案完美的解决方案
Dec 14 Javascript
JavaScript常见事件处理程序实例总结
Jan 05 Javascript
微信JS-SDK updateAppMessageShareData安卓不能自定义分享详解
Mar 29 Javascript
Cordova(ionic)项目实现双击返回键退出应用
Sep 17 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对XML的操作详解
2013/06/07 PHP
php生成mysql的数据字典
2016/07/07 PHP
php下载文件超时时间的设置方法
2016/10/06 PHP
JS location几个方法小姐
2008/07/09 Javascript
Mootools 1.2教程 Fx.Tween的使用
2009/09/15 Javascript
检测input每次的输入是否合法遇到汉字输入就有问题
2012/05/23 Javascript
使用jquery mobile做幻灯播放效果实现步骤
2013/01/04 Javascript
JS和jquery获取各种屏幕的宽度和高度的代码
2013/08/02 Javascript
Jquery仿淘宝京东多条件筛选可自行结合ajax加载示例
2013/08/28 Javascript
JQuery中使用ajax传输超大数据的解决方法
2014/07/14 Javascript
js读取json的两种常用方法示例介绍
2014/10/19 Javascript
JQuery实现防止退格键返回的方法
2015/02/12 Javascript
使用jQuery监听DOM元素大小变化
2016/02/24 Javascript
jQuery提示插件qTip2用法分析(支持ajax及多种样式)
2016/06/08 Javascript
javascript设计模式之module(模块)模式
2016/08/19 Javascript
js控制文本框只能输入中文、英文、数字与指定特殊符号的实现代码
2016/09/09 Javascript
微信小程序 数组中的push与concat的区别
2017/01/05 Javascript
React简单介绍
2017/05/24 Javascript
微信小程序授权获取用户详细信息openid的实例详解
2017/09/20 Javascript
使用veloticy-ui生成文字动画效果
2018/02/08 Javascript
Node.js进阶之核心模块https入门
2018/05/23 Javascript
vue-cli项目中使用公用的提示弹层tips或加载loading组件实例详解
2018/05/28 Javascript
Vue不能观察到数组length的变化
2018/06/08 Javascript
微信小程序如何使用云开发
2019/05/17 Javascript
Django框架模型简单介绍与使用分析
2019/07/18 Python
Python使用Matlab命令过程解析
2020/06/04 Python
Mytheresa中国官网:德国时尚奢侈品商城
2017/08/04 全球购物
如何强制垃圾回收
2015/10/06 面试题
致全体运动员广播稿
2014/02/01 职场文书
领导党性分析材料
2014/02/15 职场文书
培训科主任岗位职责
2014/08/08 职场文书
八年级上册语文教学计划
2015/01/22 职场文书
中标通知书范本
2015/04/17 职场文书
音乐课《小猫钓鱼》教学反思
2016/02/18 职场文书
CentOS 7安装mysql5.7使用XtraBackUp备份工具命令详解
2022/04/12 MySQL
nginx静态资源的服务器配置方法
2022/07/07 Servers