递归
1.一种编程模式
2.当一个函数解决一个任务时,在解决的过程中它可以调用很多其它函数。在部分情况下,函数会调用 自身。这就是所谓的 递归。
3.引擎限制了递归深度,而递归深度等于堆栈中上下文的最大数量。
4.递归中的上下文占用内存,但递归代码更短,属于易于理解和维护的好代码。
5.循环算法更节省内存,任何递归都可以用循环来重写,通常循环变体更有效。
6.应用
递归遍历—适用于任何层次的子部门嵌套。
递归结构—“链表”—某些情况下,可能是优于数组的选择。
7.当我们必须对数组内的在尾端以外的元素进行更快速的插入/删除操作时,可以选择另一种叫做 链表 的数据结构。
8.链表
let list = { value: 1 };
list.next = { value: 2 };
list.next.next = { value: 3 };
list.next.next.next = { value: 4 };
list.next.next.next.next = null;
拆分链表:
let secondList = list.next.next;
list.next.next = null;
合并链表:
list.next.next = secondList;
将新值添加到链表头部
list = { value: “new item”, next: list };
从中间删除一个值,可以修改前一个元素的 next
list.next = list.next.next;
9.缺点
无法很容易地通过元素的编号获取元素,需要从起点元素开始,顺着 next 找 N 次才能获取到第 N 个元素。
10.链表增强
(1)可在 next 之外,再添加 prev 属性来引用前一个元素,以便轻松地往回移动。
(2)可添加一个名为 tail 的变量,该变量引用链表的最后一个元素(并在从末尾添加/删除元素时对该引用进行更新)。