问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

javascript递归函数

发布网友 发布时间:2022-04-20 07:50

我来回答

3个回答

懂视网 时间:2022-04-20 12:12

我们之前给大家介绍过关于php中的递归函数、其实递归函数通常在后端用的比较多。对于后端开发人员来说,递归应该是小菜一碟,很简单的事情,但是很多前端确对这个不是很了解。其实,前端中也是经常用递归的,今天我们就给大家解析下JavaScript中的递归函数!

js递归调用

// 一个简单的阶乘函数 var f = function (x) { 
 if (x === 1) { 
 return 1; 
 } else { 
 return x * f(x - 1); 
 } };

Javascript中函数的巨大灵活性,导致在递归时使用函数名遇到困难,对于上面的变量式声明,f是一个变量,所以它的值很容易被替换:

var fn = f; f = function () {};

函数是个值,它被赋给fn,我们期待使用fn(5)可以计算出一个数值,但是由于函数内部依然引用的是变量f,于是它不能正常工作了。

所以,一旦我们定义了一个递归函数,便须注意不要轻易改变变量的名字。

上面谈论的都是函数式调用,函数还有其它调用方式,比如当作对象方法调用。

我们常常这样声明对象:

var obj1 = { 
 num : 5, 
 fac : function (x) { 
 // function body 
 } };

声明一个匿名函数并把它赋值给对象的属性(fac)。

如果我们想要在这里写一个递归,就要引用属性本身:

var obj1 = { 
 num : 5, 
 fac : function (x) { 
 if (x === 1) { 
  return 1; 
 } else { 
  return x * obj1.fac(x - 1); 
 } 
 } };

当然,它也会遭遇和函数调用方式一样的问题:

var obj2 = {fac: obj1.fac}; 
obj1 = {}; 
obj2.fac(5); // Sadness

方法被赋值给obj2的fac属性后,内部依然要引用obj1.fac,于是…失败了。

换一种方式会有所改进:

var obj1 = { 
 num : 5, 
 fac : function (x) { 
 if (x === 1) { 
  return 1; 
 } else { 
  return x * this.fac(x - 1); 
 } 
 } }; var obj2 = {fac: obj1.fac}; obj1 = {}; obj2.fac(5); // ok

通过this关键字获取函数执行时的context中的属性,这样执行obj2.fac时,函数内部便会引用obj2的fac属性。

可是函数还可以被任意修改context来调用,那就是万能的call和apply:

obj3 = {}; obj1.fac.call(obj3, 5); // dead again

于是递归函数又不能正常工作了。

我们应该试着解决这种问题,还记得前面提到的一种函数声明的方式吗?

var a = function b(){};

这种声明方式叫做内联函数(inline function),虽然在函数外没有声明变量b,但是在函数内部,是可以使用b()来调用自己的,于是

var fn = function f(x) { 
 // try if you write "var f = 0;" here 
 if (x === 1) { 
 return 1; 
 } else { 
 return x * f(x - 1); 
 } }; 
 var fn2 = fn; fn = null; fn2(5); // OK // here show the difference between "var f = function f() {}" and "function f() {}" var f = function f(x) { 
 if (x === 1) { 
 return 1; 
 } else { 
 return x * f(x - 1); 
 } }; var fn2 = f; f = null; fn2(5); // OK var obj1 = { 
 num : 5, 
 fac : function f(x) { 
 if (x === 1) { 
  return 1; 
 } else { 
  return x * f(x - 1); 
 } 
 } }; var obj2 = {fac: obj1.fac}; obj1 = {}; obj2.fac(5); // ok var obj3 = {}; obj1.fac.call(obj3, 5); // ok

就这样,我们有了一个可以在内部使用的名字,而不用担心递归函数被赋值给谁以及以何种方式被调用。

Javascript函数内部的arguments对象,有一个callee属性,指向的是函数本身。因此也可以使用arguments.callee在内部调用函数:

function f(x) { 
 if (x === 1) { 
 return 1; 
 } else { 
 return x * arguments.callee(x - 1); 
 } }

但arguments.callee是一个已经准备被弃用的属性,很可能会在未来的ECMAscript版本中消失,在ECMAscript 5中"use strict"时,不能使用arguments.callee。

最后一个建议是:如果要声明一个递归函数,请慎用new Function这种方式,Function构造函数创建的函数在每次被调用时,都会重新编译出一个函数,递归调用会引发性能问题——你会发现你的内存很快就被耗光了。

js递归函数应用

最近在做项目的时候,用到了递归函数,用来调用json的子节点,把所有json中的子节点中包含某个数的object,都push到一个数组中,然后对其进行绑定。

我是通过如下递归调用的

var new_array=[];
 function _getChilds(data){
  if(data.ObjType=="某个数"){
  new_array.push(cs_data);
 }
 if(data.Childs){
  if(data.Childs.length>0){
  getChilds(data.Childs)
  }
 }
 }
 function getChilds(data){
 for(var i=0;i<data.length;i++){
  _getChilds(data[i]);
 }
 }使用方法:getChilds("json数据")

就把json中所有包含某个数的数据push到new_array数组当中了。

总结:

相信通过对上述的讲解,大家对递归函数的认识更进阶一步、递归函数不仅仅可以再php中使用,在前端JavaScript中同样可以使用,希望对你有所帮助!

相关推荐:

JavaScript中递归函数的细化认识以及示例代码分享

JS中递归函数

js中递归函数的使用介绍

热心网友 时间:2022-04-20 09:20

因为递归是一层层请求下去,而数据是一层层返回上来:
第一百次:1
第九十九:2+1(第一百次返回的数据)
第九十八:3+(2+1)(第九十九次返回的数据)
。。。
第一次:100+4950(第二次返回的数据)

为什么TRUE可以呢?
因为true会被隐性转换为1,而false会被隐性转换为0。

递归就相当于调用了100次那个sum函数,这是很耗内存资源的;
一般可以用循环体实现的就尽量用循环体来实现,如上题目就可以改为下面的方式实现:
function sum(n){
var total = 0;
do{
total+=n;
}while(n--)
return total;
}

热心网友 时间:2022-04-20 10:38

应该已经明了递归的概念了吧?本例中相当于调用了100次sum,第一次是sum(100),运行进sum后,发现n不等于1,则会执行n + sum(n - 1),对100来说就是100 + sum(99),于是又会调用sum(99),之后是sum(98)....直到sum(1),不再调用sum,直接返回1,总体效果就是:
100 + (99 + (98 + ( .... + (1) ))),1-100的等差数列之和
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
ef英语哪个好 EF英孚英语培训怎么样? 英孚英语好不好 EF英孚教育到底好不好 大佬们,麦芒7和荣耀10那个值得入手?2500以下的机子还有啥好推荐的么... 介绍几款2500元以前的手机 像素一定要高 其他的不做要求 近期想入手一部安卓手机,价格2200到2500左右…买HTC desire Z还是 三星... 笔记本忘记开机密码怎么办急死了 笔记本电脑屏幕开机锁忘记密码 怎么办?急死了 华硕笔记本电脑开机密码忘记了怎样找回?系统是Windows 7旗舰版... 23初中毕业能当兵吗 西安市第二十三中学的介绍 武汉市第二十三中学的学校简介 西安23所中学亮相,都是什么规格?能改变入学难的困境吗? 石家庄23中学的初中到底如何 ?23和同仁那个更好些 二十三岁初中学历能做什么工作? 石家庄23中初中南校属于桥西区吗 为什么我每次用电饭锅做蛋糕都有点硬,是不是面粉放多了,还有每次涂了油底下还是会黏住,怎么办 技术成变量!长安汽车:2019翘尾,2020可期! 披露的业绩快报中为什么没有第四季度经营信息?只有前三季度的 中科曙光为什么没有四季度业绩预告? 002719什么时候公布2014年全年业绩 海油工程 什么时候发布四季度业绩 签订土地使用权出让合同时应当遵守哪些程序 这宗违法用地怎么隐蔽了20年?——对一宗违法案件中存在的系列行政过错的分析 控规是B1B2,现状是工业厂房,如何出让? 农村土地使用权转让条件有哪些 拆除重建政策 土地购买流程 出让土地转让可否与受让方重新签订土地出让合同 请写出下面这个函数的递归过程(javascript),并讲解一下注释部份 写出下面这个函数的递归过程(javascript),并讲解一下注释部份 为什么没有物流信息? 为什么发货后物流一直没有更新/没有物流信息 为什么我在淘宝网上买东西,没有物流信息 健康保险受益人不在了本金能拿回来吗 健康保险为什么比寿险复杂 c1会开不熟悉好不好找工作的嘛? 电脑开机有时会开不开,出现disk error。怎么办? 电脑有时候会开不开机,一直停在欢迎使用的页面,为什么? 我电脑有时会开不了机,还会滴滴的响,是什么原因? 为什么苹果手机电池有电,会开不开机呢? 车时间放长了怎么会开不动,也倒不动是怎么回事! 电脑为么会开不开机啊? 电脑开机时偶尔会开不起来是什么原因? 为什么开机会开不出来? 现在坐高铁要提前多久到 为什么电脑久不用会开不了机? 电脑遇到那些问题会开不了机? 为什么电脑开机的时候会开不开??