递归的概念

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

    1. 直接调用自己
    2. 简介调用自己
  • 跳出结构,有了跳出才有结果

递归的思想

  • 递归的调用,最终还是要转换为自己这个函数

    1. 如果有个函数foo,如果他是递归函数,到最后问题还是转换为函数foo的形式
    2. 递归的思想就是将一个未知问题转换为一个已解决的问题来实现

递归的步骤(技巧)

1. 假设递归函数已经写好
2. 寻找递推关系
3. 将递推关系的结构转换为递归体
4. 将临界条件加入到递归体中7你

简单递归练习

求1-100的和

  • 分析:

    1. 假设递归函数已经写好为sum,既sum(100),就是求1-100的和
    2. 寻找递推关系: 就是 n 与 n-1 ,或 n-2 之间的关系
      sum(n) == sum(n-1) + n

      1 var res = sum(100);
      2 var res = sum(99) + 100;

  1. 将递归结构转换成递归体

    1 function sum(n){
    2     return sum(n-1) + n;
    3 }

  2. 将临界条件加入到递归中
    • 求100 转换为 求99
    • 求99 转换为 求98
    • 求98 转换为 求97
    • ...
    • 求2 转换为 求1
    • 求1 转换为 求1
    • 即 sum(1) = 1
    1.   递归函数

      1 function sum(n){
      2     if(n==1) return 1;
      3     return sum(n-1) + n;
      4 }

求出斐波那契数列

  1,1,2,3,5,8,13,21,34,55,89...求第 n 项

  • 分析:

  1. 假设已知 fib(n) 为第 n 项
  2. 递归关系 * fib(n) = fib(n-1) + fib(n-2)
  3. 递归体
1 function fib(n){
2     return fib(n-1)+fib(n-2);
3 }

 4. 临界条件fib(0) == 1fib(1) == 1
 5. 递归函数
1 function fib(n){
2     if(n == 0 || n ==1) return 1;
3     return fib(n-1) + fib(n-2);
4 }

拷贝,使用递归方式(面试的时候有可能会问到)

(潘明老师:http://risky.love/2016/10/08/JavaScript%E6%B7%B1%E6%8B%B7%E8%B4%9D%E5%AE%9E%E7%8E%B0/)

  • 分析
  1. 什么是拷贝

    1. 如果拷贝的时候, 只针对当前对象的属性进行拷贝, 而属性是引用类型这个不考虑, 那么就是浅拷贝
    2. 如果拷贝的时候, 将数据的所有引用结构都拷贝一份, 那么数据在内存中独立就是深拷贝(内存隔离,完全独立)
    3. 拷贝: 复制一份. 指将对象数据复制.
    4. 在讨论深拷与浅拷的时候一定要保证对象的属性也是引用类型.
  2. 实现方法:
    1. 如果要实现深拷贝那么就需要考虑将对象的属性, 与属性的属性,都拷贝过来
  3. 2个参数,简单实现
    1. 假设已经实现 clone ( o1, o2),将对象 o2 的成员拷贝一份交给 o1
    2. 递推关系
    3. 混合方法,将 o2 的成员拷贝到 o1 中
1  function clone( o1, o2){
2             for(var key in o2){
3                 o1[key] = o2[key];
4             }
5         }

      * 假设方法已经实现,如果 o2[key] 是对象

      * 继续使用这个方法

      * 需要考虑 o2[key] 是引用类型,再一次使用clone函数

      * 如果 o2[key] 不是引用类型,那么直接赋值

      4.临界条件

        * 因为是 for in 循环,没有成员遍历时,自动结束

      5. 递归函数

 1 function clone(o1,o2){
 2     for(var key in o2){
 3         if(typeof o2[key] == 'object'){
 4             o1[key] = {};
 5             clone(o1[key],o2[key])
 6         }else{
 7             o1[key] = o2[key];
 8         }
 9     }
10 }

  4.复杂实现(一个参数)

    原理: clone(o) = new Object;

    返回一个对象 递归函数

 1 function clone(o){
 2     var temp = {};
 3     for(var key in o){
 4         if(typeof o[key] == 'object'){
 5             temp[key] = clone(o[key]);
 6         }else{
 7             temp[key] = o[key];
 8         }
 9     }
10     return temp;
11 }

使用递归实现 getElementsByClassName

  • 分析

    1. 实现一个方法byClass()需要的参数是: node: 在某个节点上寻找元素 className: 需要寻找的className arr: 找到的元素存储到这个数组中

    2. 遍历 node 的子节点,

    3. 查看这个子节点是否还有子节点,如果没有直接存储到数组中,如果有就继续递归

 1 var arr = [];
 2 function byClass(node, className, arr){
 3     //得到传入节点的所有子节点
 4     var lists = node.childNodes;
 5     for(var i = 0;i< lists.length;i++){
 6         //判断是否有相同className元素
 7         if(arr[i],className == className){
 8             arr.push(arr[i]);
 9         }
10         //判断子节点是否还有子节点
11         if(arr[i].childNodes.length > 0){
12             byClass(arr[i],className,arr);
13         }
14     }
15 }

  • 总结:

    js递归通俗的理解:所谓的递归函数就是在函数体内调用本函数。使用递归函数一定要注意,要有结束条件,处理不当就会进入死循环.

转载于:https://www.cnblogs.com/zwy-choo/p/6705429.html

JavaScript中递归使用相关推荐

  1. Javascript中递归造成的堆栈溢出及解决方案

    Javascript中递归造成的堆栈溢出及解决方案 参考文章: (1)Javascript中递归造成的堆栈溢出及解决方案 (2)https://www.cnblogs.com/cuew1987/p/4 ...

  2. javaScript中递归和arguments.callee

    现在已经不推荐使用arguments.callee(): 原因:访问arguments是个很昂贵的操作,因为它是个很大的对象,每次递归调用时都需要重新创建.影响现代浏览器的性能,还会影响闭包. 但是, ...

  3. javaScript中arguments.callee知识点

    javaScript中递归和arguments.callee javaScript中递归和arguments.callee知识点 arguments.callee 运行结果如下: 源码如下: < ...

  4. 递归javascript_使用freeCodeCamp挑战解释了JavaScript中的递归

    递归javascript In this article I will touch on a few important ideas to help you understand Recursion ...

  5. javascript中实例对象和构造函数关系、原型语法、原型链、call实现继承、apply调用函数、bind拷贝函数、拷贝继承、class类、super、严格模式、高阶函数、闭包、递归、es6简介

    实例对象和构造函数的关系及原型: 实例对象是通过构造函数创建出来的,实例对象的构造器constructor就是指向构造函数的:每个实例对象中的同一方法的指向是各不相同的,但是其属性值相同的属性可以相同 ...

  6. vb.net中递归退到最外层_面试题被问到再也不慌,深究JavaScript中的深拷贝与浅拷贝...

    " 点个关注,养成习惯,带你python爬虫的过程中学习前端 " JavaScript中的深拷贝和浅拷贝是前端面试中频繁被问到的一道题, 于是我也自己去查阅了一些资料, 然后动手敲 ...

  7. javascript中实现动画是settimeout(递归)还是用setinterval好?

    javascript中实现动画是setTimeout(递归)还是用setinterval好呢 之前,在研究js作用动画的东东,之前的做动画,的核心基本就是 setTimerout 和我们的 setIn ...

  8. 一篇文章带你了解JavaScript中的函数表达式,递归,闭包,变量,this对象,模块作用域

    作者 | Jeskson 来源 | 达达前端小酒馆 定义函数的方式: 第一种为 函数声明: 第二种为 函数表达式. 语法: function functionName(arg0, arg1, arg2 ...

  9. 在JavaScript中重复字符串的三种方法

    In this article, I'll explain how to solve freeCodeCamp's "Repeat a string repeat a string" ...

最新文章

  1. USB 之三 常用抓包/协议分析工具(Bus Hound、USBlyzer、USBTrace、USB Monitor Pro等)
  2. oracle数据库快照打点,Oracle数据库快照的使用
  3. 解决ajax中ie缓存问题(手动添加时间戳)
  4. Java同步关键字的C#版本?
  5. 【Django 2021年最新版教程8】操作Mysql数据库 mysqlclient安装和使用
  6. VTK(二)---相机外参矩阵Tcw转VTK相机,构建VR虚拟相机
  7. 学会怎么买一折飞机票
  8. 计算ERA-5数据的相对湿度(RH)与饱和水汽压差(VPD)
  9. Mark(转载)古人读书十二法
  10. android 判断 音乐是否播放,Android如何判断当前手机是否正在播放音乐并获取有关正在播放的音乐的信息...
  11. OpenCV打开相机
  12. 专利快速预审主体备案服务指南
  13. rsync远程同步+inotify监控
  14. 读书笔记--删除数据时的提示效果在项目中的应用
  15. web.xml加载详细过程(步骤)
  16. 注意!你得提前1.5h进考场,防疫要求千万别出错
  17. 1 表面肌电研究——端点检测(活动段检测)
  18. 解决w3wp.exe占用CPU和内存问题
  19. BootStrap笔记参考(全)-优极限
  20. 安卓android项目源码微信天天动听滴滴打车订票软件

热门文章

  1. yarn界面杀死application
  2. zookeeper启动失败+jps中没有QuorumPeerMain
  3. Python Django中,页面改变但链接地址没有跳转,解决方法
  4. DataFrame纵向合并
  5. 大话数据结构15 : 线索二叉树
  6. Faster RCNN中的交替训练
  7. oracle hr样本模式,Oracle 样本模式 HR
  8. python创建函数、可以接受任意多个整数参数并求和_pythonxlwt:求和函数最大参数限制?...
  9. mysql case when then 函数_MySQL case when then 语句使用和时间函数使用
  10. rust核电分解机在哪里_腐蚀RUST个工厂地点位置介绍 腐蚀如何找到相应的工厂