Js中的递归

时间: 2019-04-15阅读: 2126标签: 递归

递归函数是在一个函数通过名字调用自身的情况下构成的

//阶乘函数
function factorial(num){
  if(num <= 1){
    return 1;
  }else{
    return num * factorial(num - 1);
  }
}
console.log(factorial(4));//24


这种写法在函数有名字,而且名字以后也不会变的情况下是没有问题的。但是函数的执行与函数名factorial紧紧耦合在了一起,当函数名发生变化时,调用就出现了问题:

var trueFactorial = factorial;
factorial = null;
console.log(trueFactorial(4));//Uncaught TypeError: factorial is not a function


使用arguments.callee可以达到解耦的目的:

function factorial(num){
  if(num <= 1){
    return 1;
  }else{
    return num * arguments.callee(num - 1);
  }
}

var trueFactorial = factorial;
factorial = null;
console.log(trueFactorial(4));// 24


代码所示,无论将来函数名如何变化,始终都能保证正确的执行结果。 其中还说到,在严格模式下JavaScript是不支持arguments的,那么此时要实现一个松散耦合的递归函数该怎么实现呢?也很简单,可以结合使用函数表达式与函数声明的方式来定义递归函数:

var factorial = function f(num){
  if(num <= 1){
    return num;
  }else{
    return num * f(num - 1);
  }
}

console.log(factorial(5));// 120
console.log(f(5));// Uncaught ReferenceError: f is not defined

这样声明的函数,函数名是f但是在作用域中存在的引用为factorial,在f的内部可以访问到f,利用这个特点就做到了函数的调用与函数名的完全解耦合,无论将来调用方式如何变化,都不会影响执行结果:

var trueFactorial = factorial;
factorial = null; 
console.log(trueFactorial(4));// 24



站长推荐

1.云服务推荐: 国内主流云服务商,各类云产品的最新活动,优惠券领取。地址:阿里云腾讯云华为云

2.广告联盟: 整理了目前主流的广告联盟平台,如果你有流量,可以作为参考选择适合你的平台点击进入

链接: http://www.fly63.com/article/detial/2894

关闭

你真的懂递归吗?

因为很多算法思想都基于递归,无论是DFS、树的遍历、分治算法、动态规划等都是递归思想的应用。学会了用递归来解决问题的这种思维方式,再去学习其他的算法思想,无疑是事半功倍的。

浅谈javascript中的递归和闭包

递归和闭包作为js中很重要的一环,几乎在前端的面试中都会涉及,特别闭包。今天前端组的组长冷不丁的问了我一下,粗略的回答了一下,感觉不太满足,于是重新学习了一下,写下本篇。

js递归函数——函数体内调用本函数的方式

在js中通过如果一个函数直接或间接调用函数本身,则该函数称为递归函数。

js利用递归与promise 按顺序请求数据

项目中有一个需求,一个tabBar下面如果没有内容就不让该tabBar显示,当然至于有没有内容,需要我们通过请求的来判断,但是由于请求是异步的,如何让请求按照tabBar的顺序进行?

递归算法的理解

所谓递归,就是既有传递,又有回归,与其说是传递与回归,初学不如理解是一种 “循序递进”与“规律约束”。为什么这样说,因为递归算法相比较于循环在代码结构方面个人认为更加简洁清晰,清晰易懂,递归注重的是一种有序的规律

AngularJS templates 递归循环

使用 ng-include 进行递归循环;在指令内,可以使用这样的结构;可以使用 ng-init 重命名子级变量名称

JS递归及二叉搜索树的移除节点

递归含义:在某时某刻某个条件下调用包含自己的函数;注意点:⑴递归过程中一定要加限制条件,要不然会陷入死循环:递归有个过程,不是一步到位的,这一点尤其重要

递归思想与实战

递归算法对于一个程序员应该算是最经典的算法之一,而且它越想越乱,很多复杂算法的实现也都用到了递归,例如深度优先搜索,二叉树遍历等。面试中常常会问递归相关的内容(深拷贝,对象格式化,数组拍平,走台阶问题等)

JavaScript 中匿名函数的递归调用

不管是什么编程语言,相信稍微写过几行代码的同学,对递归都不会陌生。 以一个简单的阶乘计算为例,我们可以看出,递归就是在函数内部调用对自身的调用。

递归与循环的区别

递归:你打开面前这扇门,看到屋里面还有一扇门(这门可能跟前面打开的门一样大小(静),也可能门小了些(动)),你走过去,发现手中的钥匙还可以打开它,你推开门,发现里面还有一扇门,你继续打开

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!