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

javascript 递归函数

发布网友 发布时间:2022-05-10 17:30

我来回答

6个回答

懂视网 时间:2022-05-12 13:09

我们之前给大家介绍过关于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-05-12 10:17

其实难点就在于对递归函数的理解。所谓递归函数,就是函数在执行时调用自己。程序在调用一个函数时,首先执行这个函数的程序,执行完毕后返回到原调用前的上一级程序继续运行这一级程序。调用递归函数也是如此,在执行完递归函数,得到3之后,它要退出递归函数回到调用它的原来的主程序继续去执行原来的主程序。由于调用递归函数时程序是逐级进行的,所以返回时也是逆向逐级执行程序并返回的,即在得到3后,返回上一级执行这一级的程序就得到4(即再次执行document.writeln(num1)),再返回上一级执行这一级的程序得到5(即再次执行document.writeln(num1))。

热心网友 时间:2022-05-12 11:35

其实就是作用域,在当前函数作用域下num1>3时都只减了一,
换个想法,4才是最外层打出来的数,而对最外层来说,num只减了1,所以是4
然后把4传给了第二层,所以第二层也减了1 ,并把3传给了第3层,
因此第3层没有递归,直接打出3,
对于函数而言,都是从上到下执行,那肯定在方法里的先执行,才得到了3,3,4

热心网友 时间:2022-05-12 13:10

第一你算 运行几次 5 4 3 一共3次,为什么是334
第一次5的的时候递归 传值是4 //document.writeln(num1)未执行到
第2次 4的时候 递归 传值3 //document.writeln(num1)未执行到
第3次 这次3>3 为false 执行document.writeln(num1) 得到3
往回走 由于是--n所以就在地2次的时候实际在断点递归的时候保存的是3 同理第一次是4,追问我知道第一个 3 是怎样的结果。 但是后面的 3 跟 4 就不知道了。他是怎么输出的呢?当abc 的参数是 4 跟 5 的时候,他是怎样跳出判断语句,执行下一个的语句的呢?

追答递归递归 有去就有回,去的时候因为条件判断所以去执行别的函数,执行完了就要回去执行原来调用她的函数, 对于递归有点抽象 不是说这一次执行完了就完了 而是要看有没有调用她的函数 或者有没有break exits之类的

热心网友 时间:2022-05-12 15:01

abc(5)第一次执行函数时num1为4,执行abc(4),4大于3,num1为3执行abc(3),3不大于3,所以不执行if语句,打印出3,紧接着返回,返回到abc(4)之后的document,此时的num1为3,所以打印出3,接着返回执行abc(5)的document,打印出4,
整个过程的abc(5)之后num1变为4,接着abc(4)之后变为3,abc(3)之后没执行if语句,num1仍为3,一次返回打印出3 3 4追问我知道第一个 3 是怎样的结果。 但是后面的 3 跟 4 就不知道了。他是怎么输出的呢?当abc 的参数是 4 跟 5 的时候,他是怎样跳出判断语句,执行下一个的语句的呢?

热心网友 时间:2022-05-12 17:09

function abc(num1){
if(num1>3){
abc(--num1);
}
document.writeln(num1);
}
看看推荐答案...document.writeln(num1);不在else里面document.writeln(num1);这句是一定会执行的
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
邯郸自驾游到青岛马壕运河遗址推荐线路 株洲自驾到青岛马壕运河遗址途径地方 梧州回青岛马壕运河遗址要几个小时 石嘴山到青岛马壕运河遗址要多少油钱 可不可以用开水敷脸 开水能不能敷脸 发动机和发电机区别?? 电音之王朴智妍MV的图片? 电音之王mv里跳舞的是谁 自己怎样开网站 怎样把一个网页设置为主页 哪有电机SW文件下载,特别是一些步进电机标准件SolidWorks模型的免费下载网站? 新生儿肚脐脱落该怎么护理?你知道该怎么办吗? 什么饲料好 猪饲料哪种好 养猪用什么饲料好呢? 养猪的最好的饲料是什么饲料 请教牛肉的做法 90后小时候有一种面包油油的里面是夹心的是什么面包 有种面包,里面一圈一圈的,叫什么面包 外面一层面包皮里面一块牛肉这吃的是什么东西? 使用色带的打印机 可以调节打印的浓度吗? 冻固面包粉是什么啊做面包的用的,这个在面包里面起什么作用? 微波炉烤松子开口 如何? 请问现在卖的面包里面夹着透明透明的油 甜甜的,叫什么 微波炉可以炒松子吗?怎么操作?多谢 面包里面带的像辣椒油一样的东西是什么 乳酸菌面包里面夹心是什么 请问您知道2016五四青年节文艺晚会里《榜样的力量》的背景音乐是什么吗... 五四晚会鹿晗第几个出场唱的歌是什么 鹿晗勋章歌词 五四晚会群星闪耀,龚俊中国红张艺兴solo,谁的表演更得你心? 什么是javascript函数的递归调用? 房贷20万、10年还清,月供是多少? 怎样避免JavaScript中过长递归导致的堆栈溢出 solidworks 怎么画电机 JavaScript 如何快速得写出递归函数 没有具体尺寸,solidworks如何建这个电机的三维图 电机在solidworks怎么画 谁有电机三维图 solidworks.什么的都行 我不知道怎么画 ,求大神给下源文件,感激不尽 , javascript 构造器递归调用问题 JavaScript 的递归方法每调用一次,内存是不是又重新分配一个新的空间... JavaScript如何用递归绘制嵌套三角形? 在JavaScript使用递归函数判断质数 javascript中这个递归是怎麼算的,不能理解里面的逻辑,期待大家的帮助... solidworks的伺服电机模型能用吗 去面试,时间很紧,却发现内衣带子突然断了,并且已经去公司的车上,怎么办??? 高分跪求solidworks三维图的源文件啊,滚筒,电动机,减速器什么的,多给几个,另加分 明天要出远门了今天洗澡穿内衣带子突然断了又换了一件带子又断了是预示着什么吗? solidworks装配图时的电机怎么画 solidworks怎么调用电机 我的内裤内衣带子经常断,还破小洞是为什么,请教时,不要说粗口好吗