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 相关文章推荐
php上传图片并给图片打上透明水印的代码
Jun 07 Javascript
js中将字符串转换成json的三种方式
Jan 12 Javascript
jquery easyui combox一些实用的小方法
Dec 25 Javascript
Mac OS X 系统下安装和部署Egret引擎开发环境
Sep 03 Javascript
javascript轻量级库createjs使用Easel实现拖拽效果
Feb 19 Javascript
jQuery的Each比JS原生for循环性能慢很多的原因
Jul 05 Javascript
原生JS实现轮播效果+学前端的感受(防止走火入魔)
Aug 21 Javascript
AngularJS框架中的双向数据绑定机制详解【减少需要重复的开发代码量】
Jan 19 Javascript
webpack4的迁移的使用方法
May 25 Javascript
微信小程序 swiper 组件遇到的问题及解决方法
May 26 Javascript
解决vue net :ERR_CONNECTION_REFUSED报错问题
Aug 13 Javascript
vue @ ~ 相对路径 路径别名设置方式
Jun 05 Vue.js
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之readdir函数用法实例
2014/11/13 PHP
Sublime里直接运行PHP配置方法
2014/11/28 PHP
PHP中把错误日志保存在系统日志中(Windows系统)
2015/06/23 PHP
Laravel 创建指定表 migrate的例子
2019/10/09 PHP
jquery 简单的进度条实现代码
2010/03/11 Javascript
jQuery Ajax提交表单查询获得数据实例代码
2012/09/19 Javascript
js验证是否为数字的总结
2013/04/14 Javascript
js打造数组转json函数
2015/01/14 Javascript
JavaScript中setFullYear()方法的使用详解
2015/06/11 Javascript
再谈JavaScript线程
2015/07/10 Javascript
微信小程序获取手机系统信息的方法【附源码下载】
2017/12/07 Javascript
WebGL学习教程之Three.js学习笔记(第一篇)
2019/04/25 Javascript
微信小程序实现禁止分享代码实例
2019/10/19 Javascript
vue+导航锚点联动-滚动监听和点击平滑滚动跳转实例
2019/11/13 Javascript
使用go和python递归删除.ds store文件的方法
2014/01/22 Python
python批量生成本地ip地址的方法
2015/03/23 Python
Python 使用with上下文实现计时功能
2018/03/09 Python
在unittest中使用 logging 模块记录测试数据的方法
2018/11/30 Python
python 并发编程 多路复用IO模型详解
2019/08/20 Python
CSS3 优势以及网页设计师如何使用CSS3技术
2009/07/29 HTML / CSS
一款纯css3实现的颜色渐变按钮的代码教程
2014/11/12 HTML / CSS
美国创意礼品网站:UncommonGoods
2017/02/03 全球购物
美国户外服装和装备购物网站:Outland USA
2020/03/22 全球购物
医药专业应届毕业生求职信范文
2014/01/01 职场文书
仓库规划计划书
2014/04/28 职场文书
工作推荐信范文
2014/05/10 职场文书
欢迎标语大全
2014/06/21 职场文书
学生夜不归宿检讨书
2014/09/23 职场文书
停车位租赁协议书
2014/09/24 职场文书
纪委立案决定书
2015/06/24 职场文书
养成教育主题班会
2015/08/13 职场文书
2016优秀护士求职自荐信
2016/01/28 职场文书
《小摄影师》教学反思
2016/02/18 职场文书
SQLServer 错误: 15404,无法获取有关 Windows NT 组/用户 WIN-8IVSNAQS8T7\Administrator 的信息
2021/06/30 SQL Server
mysql 索引合并的使用
2021/08/30 MySQL
CSS控制继承中的height能变为可继承吗
2022/06/10 HTML / CSS