资讯专栏INFORMATION COLUMN

js 递归调用

Gemini / 1704人阅读

摘要:递归的概念在程序中函数直接或间接调用自己注意使用递归函数一定要注意,处理不当就会进入死循环。递归函数只有在特定的情况下使用,比如阶乘问题。使用是一个指向正在执行的函数的指针,返回正在被执行的对现象。

</>复制代码

  1. 程序员不止眼前的逻辑和代码,还有底层的框架与架构。
1. 前言

最近在做一个复杂表格设计数据格式设置,其中用到了多叉树的原理,所以要用到递归来实现数据格式化。

2. 递归的概念

在程序中函数直接或间接调用自己

注意:使用递归函数一定要注意,处理不当就会进入死循环。递归函数只有在特定的情况下使用 ,比如阶乘问题。

3. 例子 1. 一个阶乘的例子:

</>复制代码

  1. function fact(num) {
  2. if (num <= 1) {
  3. return 1;
  4. } else {
  5. return num * fact(num - 1);
  6. }
  7. }
  8. fact(3) // 结果为 6

以下代码可导致出错:

</>复制代码

  1. var anotherFact = fact;
  2. fact = null;
  3. alert(antherFact(4)); //出错

由于fact已经不是函数了,所以出错。

使用arguments.callee
arguments.callee 是一个指向正在执行的函数的指针,arguments.callee 返回正在被执行的对现象。
新的函数为:

</>复制代码

  1. function fact(num){
  2. if (num<=1){
  3. return 1;
  4. }else{
  5. return num*arguments.callee(num-1); //此处更改了。
  6. }
  7. }
  8. var anotherFact = fact;
  9. fact = null;
  10. alert(antherFact(4)); //结果为24.
2.再看一个多叉树的例子:

先看图

数据结构格式,参考如下代码:

</>复制代码

  1. headerData: {
  2. name: "总数据",
  3. children: [
  4. {
  5. name: "数据1",
  6. children: [
  7. {
  8. name: "数据11",
  9. children: [
  10. {
  11. name: "数据111",
  12. },
  13. {
  14. name: "数据112",
  15. }
  16. ]
  17. },
  18. {
  19. name: "数据12",
  20. children: [
  21. {
  22. name: "数据121",
  23. },
  24. {
  25. name: "数据122",
  26. }
  27. ]
  28. },
  29. {
  30. name: "数据13",
  31. children: [
  32. {
  33. name: "数据131",
  34. },
  35. {
  36. name: "数据132",
  37. }
  38. ]
  39. },
  40. {
  41. name: "数据14",
  42. },
  43. ]
  44. }
  45. ]
  46. }

我们如何获取节点的所有叶子节点个数呢? 递归代码如下:

</>复制代码

  1. /**
  2. * 获取 节点的所有 叶子节点 个数
  3. * @param {Object} json Object对象
  4. */
  5. function getLeafCountTree(json) {
  6. if(!json.children){
  7. return 1;
  8. }else{
  9. var leafCount = 0;
  10. for(var i = 0 ; i < json.children.length ; i++){
  11. leafCount = leafCount + getLeafCountTree(json.children[i]);
  12. }
  13. return leafCount;
  14. }
  15. }
最后

递归遍历是比较常用的方法,比如:省市区遍历成树、多叉树、阶乘等。
希望本文对你有点帮助。

你以为本文就这么结束了 ? 精彩在后面 !!!

全栈修炼 有兴趣的朋友可以扫下方二维码关注我的公众号

我会不定期更新有价值的内容,长期运营。

关注公众号并回复 福利 可领取免费学习资料,福利详情请猛戳: Python、Java、Linux、Go、node、vue、react、javaScript

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/96415.html

相关文章

  • JavaScript中的递归

    摘要:第三次第四次设想,如果传入的参数值特别大,那么这个调用栈将会非常之大,最终可能超出调用栈的缓存大小而崩溃导致程序执行失败。注意尾递归不一定会将你的代码执行速度提高相反,可能会变慢。 译者按: 程序员应该知道递归,但是你真的知道是怎么回事么? 原文: All About Recursion, PTC, TCO and STC in JavaScript 译者: Fundebug ...

    Jacendfeng 评论0 收藏0
  • 翻译连载 | 第 9 章:递归(下)-《JavaScript轻量级函数式编程》 |《你不知道的JS

    摘要:每个函数调用都将开辟出一小块称为堆栈帧的内存。当第二个函数开始执行,堆栈帧增加到个。当这个函数调用结束后,它的帧会从堆栈中退出。保持堆栈帧跟踪函数调用的状态,并将其分派给下一个递归调用迭。 原文地址:Functional-Light-JS 原文作者:Kyle Simpson-《You-Dont-Know-JS》作者 关于译者:这是一个流淌着沪江血液的纯粹工程:认真,是 HTM...

    LeviDing 评论0 收藏0
  • [翻译] JS递归与TCO尾调用优化

    这两天搜了下JS递归的相关文章, 觉得这篇文章很不错, 就顺手翻译了下,也算给自己做个笔记,题目是我自己加的。原文很长,写得也很详尽,这里并非逐字翻译, 而是作者所讲的主要概念加上我自己的一些理解,本文中解决方案的实际意义并不是特别大,但算法的逻辑挺有意思,不过也略抽象,理解需要花点时间(囧,估计我太闲了) 文中的用例?全部来自原文: 原文链接:(原题为:理解JS函数式编程中的递归)Underst...

    pekonchan 评论0 收藏0
  • JS递归与二叉树的遍历

    摘要:貌似大部分语言中的递归都差不多,之所以在标题加是因为搜了下后感觉网上用来描述这概念的不多,简单地说递归就是函数调用自己的过程。 貌似大部分语言中的递归都差不多, 之所以在标题加JS是因为搜了下后感觉网上用js来描述这概念的不多, 简单地说递归就是函数调用自己的过程。下面的栗子可以很直观地展示递归的执行过程: function rec(x){ if(x!==1){ console....

    church 评论0 收藏0
  • 翻译连载 | 第 9 章:递归(上)-《JavaScript轻量级函数式编程》 |《你不知道的JS

    摘要:一旦我们满足了基本条件值为,我们将不再调用递归函数,只是有效地执行了。递归深谙函数式编程之精髓,最被广泛引证的原因是,在调用栈中,递归把大部分显式状态跟踪换为了隐式状态。 原文地址:Functional-Light-JS 原文作者:Kyle Simpson-《You-Dont-Know-JS》作者 关于译者:这是一个流淌着沪江血液的纯粹工程:认真,是 HTML 最坚实的梁柱;...

    MasonEast 评论0 收藏0
  • js算法入门(3)--递归

    摘要:在递归过程中,未完成计算的函数将会挂起压入调用堆栈,不然递归结束的时候没办法进行回溯。这就引出了回溯法回溯法就是在达到递归边界前的某层,由于一些事实导致已经不需要前往任何一个子问题递归,就可以直接返回上一层。 1简介 递归在前端开发中应用还是非常广泛的,首先DOM就是树状结构,而这种结构使用递归去遍历是非常合适的。然后就是对象和数组的深复制很多库也是使用递归实现的例如jquery中的e...

    jzman 评论0 收藏0

发表评论

0条评论

Gemini

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<