javascript递归函数定义和用法示例分析


Posted in Javascript onJuly 22, 2020

递归函数:是指函数直接或间接调用函数本身,则称该函数为递归函数。

这句话理解起来并不难,从概念上出发,给出以下的例子:

function foo(){
 console.log("函数 foo 是递归函数。");
 foo();
}

这个例子的 foo 函数就是一个递归函数。

当你把这个函数拿到浏览器上运行的时候,你会发现内存溢出了,为什么呢?因为这个递归函数没有停止处理或运算的出口,因此这个递归函数就演变为一个死循环。

那如何使用递归呢?

使用递归函数必须要符合两个条件:

1、 在每一次调用自己时,必须是(在某种意义上)更接近于解;

这句话怎么理解?

大家家里都有楼梯吧?比如从一楼走到二楼,那么我们的起点是一楼,目的地是二楼,当你往上每走一个台阶是不是越接近二楼,也就是越接近目的地。
因此这句话可以这样理解:函数每一次调用自己时,就越接近于我们期望它完成的任务的终点。

2、必须有一个终止处理或计算的出口

这句话的意思是:必须要有一个标准的标志,让函数结束调用函数自身。
比如,怎么知道你已经走到二楼了呢?当你看到有个门,门牌上写着 2F 的,然后推开它跨过去,那么你就到二楼了。

用递归输出对象里包含的所有属性值(包括对象里的子孙对象):

var obj = {
 a:{
  name:"john",
  age:26,
  sex:"male",
  child:{
   firstChild:"mak",
   laseChild:"loy"
  }
 },

 b:{
  name:"joe", 
  age:28, 
  sex:"female", 
  child:{
   firstChild:"bill", 
   secondChild:"ruth", 
   laseChild:"yoki"
  }
 }
};

function getObjValue(obj){
 for(var k in obj){
  if(typeof obj[k] !== "object"){
   console.log(obj[k]); //递归出口
  }else{
   getObjValue(obj[k]); //函数调用函数自身
  }
 }
};

getObjValue(obj);

// 输出结果:

// name=john
// age=26
// sex=male
// firstChild=mak
// laseChild=loy
// name=joe
// age=28
// sex=female
// firstChild=bill
// secondChild=ruth
// laseChild=yoki

使用建议:在使用递归时,要注意对递归函数的参数类型的检查,一定要保证有一个终止处理或计算的出口。否则很容易演变为死循环,从而造成内存溢出。

到此这篇关于javascript递归函数定义和用法示例分析的文章就介绍到这了,更多相关javascript递归函数内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
jquery实现图片等比例缩放以及max-width在ie中不兼容解决
Mar 21 Javascript
js动态创建、删除表格示例代码
Aug 07 Javascript
jQuery客户端分页实例代码
Nov 18 Javascript
JS仿Windows开机启动Loading进度条的方法
Feb 26 Javascript
javascript中的Function.prototye.bind
Jun 25 Javascript
javascript创建对象的几种模式介绍
May 06 Javascript
JavaScript Ajax编程 应用篇
Jul 02 Javascript
详解ECMAScript6入门--Class对象
Apr 27 Javascript
详解使用jQuery.i18n.properties实现js国际化
May 04 jQuery
JavaScript 中的12种循环遍历方法【总结】
May 31 Javascript
vue框架搭建之axios使用教程
Jul 11 Javascript
JavaScript设计模式--简单工厂模式定义与应用案例详解
May 23 Javascript
简单了解vue 插值表达式Mustache
Jul 22 #Javascript
详解node.js 事件循环
Jul 22 #Javascript
jQuery+ThinkPHP实现图片上传
Jul 23 #jQuery
详解vue中v-on事件监听指令的基本用法
Jul 22 #Javascript
使用vue实现通过变量动态拼接url
Jul 22 #Javascript
浅谈JavaScript窗体Window.ShowModalDialog使用
Jul 22 #Javascript
解决vue里a标签值解析变量,跳转页面,前面加默认域名端口的问题
Jul 22 #Javascript
You might like
4月1日重磅发布!《星际争霸II》6.0.0版本更新
2020/04/09 星际争霸
php adodb分页实现代码
2009/03/19 PHP
JavaScript 常见对象类创建代码与优缺点分析
2009/12/07 Javascript
jQuery-ui中自动完成实现方法
2010/06/10 Javascript
js获得网页背景色和字体色的方法
2014/03/21 Javascript
PHP 数组current和next用法分享
2015/03/05 Javascript
javascript+ajax实现产品页面加载信息
2015/07/09 Javascript
jQuery+PHP+MySQL二级联动下拉菜单实例讲解
2015/10/27 Javascript
jQuery ajax请求返回list数据动态生成input标签,并把list数据赋值到input标签
2016/03/29 Javascript
jQuery操作cookie
2016/08/08 Javascript
轻松学习Javascript闭包
2017/03/01 Javascript
vue-cli如何快速构建vue项目
2017/04/26 Javascript
Vue 让元素抖动/摆动起来的实现代码
2018/05/31 Javascript
解决vue-cli webpack打包后加载资源的路径问题
2018/09/25 Javascript
详解JS实现系统登录页的登录和验证
2019/04/29 Javascript
js类的继承定义与用法分析
2019/06/21 Javascript
[34:39]Secret vs VG 2018国际邀请赛淘汰赛BO3 第二场 8.23
2018/08/24 DOTA
Python基础入门之seed()方法的使用
2015/05/15 Python
Python中不同进制的语法及转换方法分析
2016/07/27 Python
Ubuntu安装Jupyter Notebook教程
2017/10/18 Python
详解Python使用tensorflow入门指南
2018/02/09 Python
pycharm设置注释颜色的方法
2018/05/23 Python
python调用函数、类和文件操作简单实例总结
2019/11/29 Python
jupyter lab文件导出/下载方式
2020/04/22 Python
Eclipse配置python默认头过程图解
2020/04/26 Python
keras 权重保存和权重载入方式
2020/05/21 Python
HMV日本官网:全球知名的音乐、DVD和电脑游戏零售巨头
2016/08/13 全球购物
生产车间主任的个人自我鉴定
2013/10/25 职场文书
大四毕业生学习总结的自我评价
2013/10/31 职场文书
天鹅的故事教学反思
2014/02/04 职场文书
优秀老员工获奖感言
2014/02/15 职场文书
幼儿园教师教学反思
2016/03/02 职场文书
MySQL数据库必备之条件查询语句
2021/10/15 MySQL
电频谱管理的原则是什么
2022/02/18 无线电
详解NumPy中的线性关系与数据修剪压缩
2022/05/25 Python
分享很少见很有用的SQL功能CORRESPONDING
2022/08/05 MySQL