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 相关文章推荐
JSON JQUERY模板实现说明
Jul 03 Javascript
javaScript实现浮点数转十六进制字符
Oct 29 Javascript
jQuery中noConflict()用法实例分析
Feb 08 Javascript
js实现圆盘记速表
Aug 03 Javascript
JavaScript如何获取数组最大值和最小值
Nov 18 Javascript
浅谈jQuery双事件多重加载的问题
Oct 05 Javascript
微信小程序 连续旋转动画(this.animation.rotate)详解
Apr 07 Javascript
Vue中 key keep-alive的实现原理
Sep 18 Javascript
使用webpack搭建vue项目实现脚手架功能
Mar 15 Javascript
vue-loader中引入模板预处理器的实现
Sep 04 Javascript
vue实现日历表格(element-ui)
Sep 24 Javascript
vue中如何自定义右键菜单详解
Dec 08 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实现的生成静态HTML速度快类库
2007/03/31 PHP
晋城吧对DiscuzX进行的前端优化要点
2010/09/05 PHP
PHP数组排序函数合集 以及它们之间的联系分析
2013/06/27 PHP
PHP中filter函数校验数据的方法详解
2015/07/31 PHP
Javascript实现重力弹跳拖拽运动效果示例
2013/06/28 Javascript
JavaScript包装对象使用介绍
2013/08/29 Javascript
浅谈javascript 归并方法
2015/01/21 Javascript
jQuery实现带动画效果的二级下拉导航方法
2015/03/11 Javascript
将html页面保存成图片,图片写入pdf的实现方法(推荐)
2016/09/17 Javascript
jQuery解析XML 详解及方法总结
2016/09/28 Javascript
JavaScript之Vue.js【入门基础】
2016/12/06 Javascript
一篇文章让你彻底弄懂JS的事件冒泡和事件捕获
2017/08/14 Javascript
JavaScript实现HTML5游戏断线自动重连的方法
2017/09/18 Javascript
React Native 截屏组件的示例代码
2017/12/06 Javascript
nuxt.js 缓存实践
2018/06/25 Javascript
详解基于 Node.js 的轻量级云函数功能实现
2019/07/08 Javascript
Node.js+Vue脚手架环境搭建的方法步骤
2020/03/08 Javascript
[01:02:04]EG vs Liquid 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.23
2019/09/05 DOTA
[05:37]DOTA2-DPC中国联赛 正赛 Elephant vs iG 选手采访
2021/03/11 DOTA
Python中map和列表推导效率比较实例分析
2015/06/17 Python
python负载均衡的简单实现方法
2018/02/04 Python
Django 响应数据response的返回源码详解
2019/08/06 Python
python之yield和Generator深入解析
2019/09/18 Python
python使用配置文件过程详解
2019/12/28 Python
python实现简单俄罗斯方块
2020/03/13 Python
基于Python+QT的gui程序开发实现
2020/07/03 Python
利用html5 canvas动态画饼状图的示例代码
2018/04/02 HTML / CSS
英超联赛的首选足球:Mitre足球
2019/05/06 全球购物
考试没考好检讨书(精选篇)
2014/11/16 职场文书
淘宝好评语句大全
2014/12/31 职场文书
湘江北去观后感
2015/06/15 职场文书
考教师资格证不要错过的4个最佳时机
2019/07/17 职场文书
2019年暑期法院实习报告
2019/12/18 职场文书
基于go interface{}==nil 的几种坑及原理分析
2021/04/24 Golang
Python实现位图分割的效果
2021/11/20 Python
mysql使用instr达到in(字符串)的效果
2022/04/03 MySQL