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 相关文章推荐
js创建数据共享接口——简化框架之间相互传值
Oct 23 Javascript
js时间日期和毫秒的相互转换
Feb 22 Javascript
js使用DOM操作实现简单留言板的方法
Apr 10 Javascript
javascript巧用eval函数组装表单输入项为json对象的方法
Nov 25 Javascript
jQuery实现图片加载完成后改变图片大小的方法
Mar 29 Javascript
浅谈jQuery animate easing的具体使用方法(推荐)
Jun 17 Javascript
用jQuery旋转插件jqueryrotate制作转盘抽奖
Feb 10 Javascript
微信小程序与php 实现微信支付的简单实例
Jun 23 Javascript
JS按钮闪烁功能的实现代码
Jul 21 Javascript
SVG实现时钟效果
Jul 17 Javascript
微信小程序发布新版本时自动提示用户更新的方法
Jun 07 Javascript
JavaScript基于用户照片姓名生成海报
May 29 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
php初学者写及时补给skype用户充话费的小程序
2008/11/02 PHP
php循环检测目录是否存在并创建(循环创建目录)
2011/01/06 PHP
PHP 无限分类三种方式 非函数的递归调用!
2011/08/26 PHP
thinkphp配置文件路径的实现方法
2016/08/30 PHP
php实现多站点共用session实现单点登录的方法详解
2019/09/18 PHP
PHP过滤器 filter_has_var() 函数用法实例分析
2020/04/23 PHP
ie 处理 gif动画 的onload 事件的一个 bug
2007/04/12 Javascript
jQuery对象与DOM对象之间的转换方法
2010/04/15 Javascript
JavaScript常用验证函数实例汇总
2014/11/25 Javascript
JavaScript代码性能优化总结(推荐)
2016/05/16 Javascript
JavaScript使用forEach()与jQuery使用each遍历数组时return false 的区别
2016/08/26 Javascript
JavaScript对象封装的简单实现方法(3种方法)
2017/01/03 Javascript
基于Vue单文件组件详解
2017/09/15 Javascript
基于jQuery选择器之表单对象属性筛选选择器的实例
2017/09/19 jQuery
浅析为什么a="abc" 不等于 a=new String("abc")
2017/10/25 Javascript
JavaScript实现省份城市的三级联动
2020/02/11 Javascript
Vue(定时器)解决mounted不能获取到data中的数据问题
2020/07/30 Javascript
[05:34]2014DOTA2国际邀请赛中国区预选赛精彩TOPPLAY第二弹
2014/06/25 DOTA
Python中的rfind()方法使用详解
2015/05/19 Python
详解python中list的使用
2019/03/15 Python
django之自定义软删除Model的方法
2019/08/14 Python
python队列原理及实现方法示例
2019/11/27 Python
Python selenium的基本使用方法分析
2019/12/21 Python
解决matplotlib.pyplot在Jupyter notebook中不显示图像问题
2020/04/22 Python
基于Pyinstaller打包Python程序并压缩文件大小
2020/05/28 Python
pyCharm 设置调试输出窗口中文显示方式(字符码转换)
2020/06/09 Python
Python如何避免文件同名产生覆盖
2020/06/09 Python
SportsDirect.com新加坡:英国第一体育零售商
2019/03/30 全球购物
机械设计职业生涯规划书
2013/12/27 职场文书
土木工程专业个人求职信
2013/12/30 职场文书
公司2014年度工作总结
2014/12/10 职场文书
污水处理保证书
2015/05/09 职场文书
安全教育的主题班会
2015/08/13 职场文书
《三国志》赏析
2019/08/27 职场文书
python实现腾讯滑块验证码识别
2021/04/27 Python
六个好看实用的 HTML + CSS 后台登录入口页面
2022/04/28 HTML / CSS