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 相关文章推荐
ExtJS 学习专题(一) 如何应用ExtJS(附实例)
Mar 11 Javascript
你未必知道的JavaScript和CSS交互的5种方法
Apr 02 Javascript
Egret引擎开发指南之视觉编程
Sep 03 Javascript
JS实现浏览器状态栏显示时间的方法
Oct 27 Javascript
JS Attribute属性操作详解
May 19 Javascript
Three.js基础学习之场景对象
Sep 27 Javascript
ES6学习教程之块级作用域详解
Oct 09 Javascript
使用proxy实现一个更优雅的vue【推荐】
Jun 19 Javascript
Vuejs 实现简易 todoList 功能 与 组件实例代码
Sep 10 Javascript
如何基于layui的laytpl实现数据绑定的示例代码
Apr 10 Javascript
使用js和canvas实现时钟效果
Sep 08 Javascript
JavaScript编码小技巧分享
Sep 17 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
ezSQL PHP数据库操作类库
2010/05/16 PHP
11个PHPer必须要了解的编程规范
2014/09/22 PHP
CI框架给视图添加动态数据
2014/12/01 PHP
PHP中使用imagick生成PSD文件缩略图教程
2015/01/26 PHP
PHP实现的memcache环形队列类实例
2015/07/28 PHP
HR vs CL BO3 第二场 2.13
2021/03/10 DOTA
javascript 支持链式调用的异步调用框架Async.Operation
2009/08/04 Javascript
js 兼容多浏览器的回车和鼠标焦点事件代码(IE6/7/8,firefox,chrome)
2010/04/14 Javascript
jQuery.clean使用方法及思路分析
2013/01/07 Javascript
JavaScript中的typeof操作符用法实例
2014/04/05 Javascript
老生常谈 js中this的指向
2016/06/30 Javascript
jQuery实现CheckBox全选、全不选功能
2017/01/11 Javascript
Vue.js组件tab实现选项卡切换
2020/03/23 Javascript
vue实现登陆登出的实现示例
2017/09/15 Javascript
jquery 一键复制到剪切板的实例
2017/09/20 jQuery
JavaScript进阶(二)词法作用域与作用域链实例分析
2020/05/09 Javascript
JS实现网站楼层导航效果代码实例
2020/06/16 Javascript
[50:05]VGJ.S vs OG 2018国际邀请赛淘汰赛BO3 第二场 8.22
2018/08/23 DOTA
Python 拷贝对象(深拷贝deepcopy与浅拷贝copy)
2008/09/06 Python
python实现探测socket和web服务示例
2014/03/28 Python
python实现根据图标提取分类应用程序实例
2014/09/28 Python
一个基于flask的web应用诞生(1)
2017/04/11 Python
Python管理Windows服务小脚本
2018/03/12 Python
python 3.6.5 安装配置方法图文教程
2018/09/18 Python
Python将字符串常量转化为变量方法总结
2019/03/17 Python
Python实现图像的垂直投影示例
2020/01/17 Python
python使用matplotlib绘制折线图的示例代码
2020/09/22 Python
夜大毕业自我鉴定
2013/10/11 职场文书
小车司机岗位职责
2013/11/25 职场文书
运动会通讯稿150字
2014/02/15 职场文书
班主任工作经验交流材料
2014/05/13 职场文书
大学毕业生个人自荐书
2014/07/02 职场文书
授权委托书范文
2014/07/31 职场文书
感恩祖国演讲稿
2014/09/09 职场文书
2015年党员创先争优公开承诺书
2015/04/27 职场文书
剑指Offer之Java算法习题精讲二叉树专项训练
2022/03/21 Java/Android