前言:锻炼自己的思想,规范自己的编程思路。
问题:
现给定一个整数的 多维数组 ,请你返回一个生成器对象,按照 中序遍历 的顺序逐个生成整数。
多维数组 是一个递归数据结构,包含整数和其他 多维数组。
中序遍历 是从左到右遍历每个数组,在遇到任何整数时生成它,遇到任何数组时递归应用 中序遍历 。
示例:(放代码里面)
输入:arr = [[[6]],[1,3],[]]
输出:[6,1,3]
解释:
const generator = inorderTraversal(arr);
generator.next().value; // 6
generator.next().value; // 1
generator.next().value; // 3
generator.next().done; // true
思路:
这段代码定义了一个名为 inorderTraversal 的生成器函数,它接受一个多维数组作为输入。
在函数内部,使用 for...of 循环遍历输入数组的每个元素。对于每个元素,使用 Array.isArray 方法检查它是否为数组。
- 如果元素是数组,则递归调用inorderTraversal 函数,并使用 yield* 语句将返回的生成器对象委托给当前生成器对象。这样,当遍历当前生成器对象时,也会遍历返回的生成器对象。
- 如果元素不是数组,则使用 yield 语句将其作为生成器对象的下一个值。
这样,当遍历生成器对象时,会按照中序遍历的顺序逐个生成整数。
基于上述思考,代码如下:
var inorderTraversal = function*(arr) {
for (const item of arr) {
if (Array.isArray(item)) {
yield* inorderTraversal(item);
} else {
yield item;
}
}
};
执行结果如下图:
通过这个题,我们可以学到以下知识点:
- 生成器函数:生成器函数是一种特殊的函数,它可以返回一个生成器对象。生成器对象可以按顺序生成一系列值,而不是一次性返回所有值。生成器函数使用 function* 关键字定义。
- yield 语句:yield 语句用于在生成器函数中定义生成器对象的值。每次调用生成器对象的 next 方法时,都会返回 yield 语句后面的值。
- 递归:递归是一种编程技巧,它允许函数调用自身。递归通常用于解决可以分解为相似子问题的问题。
- 中序遍历:中序遍历是一种遍历多维数组的方法。它从左到右遍历每个数组,在遇到任何整数时生成它,遇到任何数组时递归应用中序遍历。