这是我参与11月更文挑战的第11天,活动详情查看:2021最后一次更文挑战
前几篇文章-直达列表 学习了几个 JavaScript 并不完美但是不影响其运行的一些神奇小"bug":
上一篇写到 函数的可选参数, 本篇继续学习 JavaScript 函数的 递归 recursion
JavaScript 函数-递归
简单点来理解: 函数的递归就是 函数内部调用自己,一个递归函数可以接受两个输入参数:一个最终状态(终止递归)或一个递归状态(继续递归)。
递归概念
上文学到闭包的概念, 函数嵌套函数, 那么 递归 也同样在函数内部嵌套自己, 也相当于闭包.
再来看一下 "百度百科" 对递归的概念的描述: "程序调用自身的编程技巧称为递归(recursion)。" 也就是递归作为一种算法在前端和后端都广泛应用的. 但是递归也是有很 da 的缺点的, 应尽量避免使用...还是要学习一下
递归函数的作用
递归函数就调用自己的函数. 在某些算法中, 处理一些类似树相关的数据结构的算法, 就可以利用递归函数方便简洁地实现.
函数调用自身需要注意"栈溢出"的问题, 需要控制条件, 以免调用太多次而产生的溢出栈的问题. 递归允许以不同的样式来进行编写函数:
我们在写递归函数时需要注意内存的大小限制: 比如 函数A 调用 函数B, 函数B 调用 函数C, JavaScript 解释器需要记住这个三个函数的执行上下文:当最内部 函数 C 执行完后, 需要知道在哪里恢复函数 B, 同理 函数 B 执行完成后, 函数 A 的恢复也需要清楚.
function 函数A() {
function 函数B() {
function 函数C() {}
}
}
函数递归的应用
在一些数据结构中, 使用递归可以方便地帮助我们处理数据: 被用于处理包含有更小的子问题的一类问题
比如对 DOM 的操作处理: 对一个节点DOM 的子节点进行递归操作
function walkTree(node) {
if (node == null) //
return;
// ... 这里省略对节点的具体操作
//
for (var i = 0; i < node.childNodes.length; i++) {
walkTree(node.childNodes[i]);
}
}
下文更新对闭包/递归的高级用法学习: 高阶函数
高阶函数: 一个函数将其他函数作为参数 或者 返回其他函数来进行操作